TCP套接字:主机(IP+端口) 和 服务器(IP+端口) 进行通讯,需要中间的一个锁套进行 啮合,这个锁套就是套接字的作用。
其中套接字的使用必须运用数数据流配合才可以。
第一种:不用套接字+不用数据流操作
//客户端发送信息
1 void client::clientSendMessage ()
2
3 {
4
5 QByteArray data;
6
7 data.append(ui->clientMessagelineEdit->text());
8
9 tcp->write(data);
10
11 ui->messagetextBrowser->insertPlainText (tr("send message: %1
").arg (QString(data)));
12
13 }
14
15
第二种:使用套接字+使用数据流
void MainWindow::sendMessage()
{
QByteArray block;//暂时存储我们需要发送的数据
QDataStream out(&block,QIODevice::WriteOnly);//TCP必须和数据流一起使用
out.setVersion(QDataStream::Qt_5_7);//设置数据流的版本(服务器和主机版本一定相同)
out<<(quint16)0;//强制转化,quint16=unsigned short,向头部添加0为了开辟空间存放文件大小
out << tr("123");
out.device()->seek(0);//向头添加数据,类似链表
out <<(quint16)(block.size()-sizeof(quint16));//文件大小
//*************利用“套接字”进行服务器和主机的连接和通讯****************//
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection,SIGNAL(disconnected()),//断开连接同时删除套接字
clientConnection,SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();//此函数关闭套接字触发disconnected()函数,接着由上面连接触发deleteLater()删除套接字
ui->label_3->setText("successful sendmessage");
}
注释:1.校验的TCP(文件大小+文件信息+文件名+文件),通用的TCP(文件)。当写通用的时候应写后者,当自己使用时可以写前者保证数据准确性,但是一定保证接收端程序也应按照这个格式接受。
2.通用的软件没有数据流和套接字,自己写的软件都可以加。有数据流的TCP和没有数据流的TCP不能进行数据的传送!!!