QTcpServer / QTcpSocket

最后更新于:2022-04-02 02:15:01

[TOC] ## 实例 构造函数中 创建连接 ``` tcpServer = new QTcpServer(this); if(!tcpServer->listen(QHostAddress::LocalHost,6666)) { qDebug() << tcpServer->errorString(); close(); } //连接信号和相应槽函数 connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage())); ``` 发送信息 1. 不管是发送文件还是字符串,都是可以用这种方式,发送时候声明包的大小 2. `out<<(quint16) 0;`在`block`的开始添加了一个两字节大小的空间然后`out<seek(0);`返回到`block`的开始,加入实际的文件大小信息 `out<<(quint16) (block.size() - sizeof(quint16));` ``` void Widget::sendMessage() { //用于暂存我们要发送的数据 QByteArray block; //使用数据流写入数据 QDataStream out(&block,QIODevice::WriteOnly); out<<(quint16) 0; out<seek(0); out<<(quint16) (block.size() - sizeof(quint16)); //我们获取已经建立的连接的子套接字 QTcpSocket *clientConnection = tcpServer->nextPendingConnection(); connect(clientConnection,SIGNAL(disconnected()),clientConnection, SLOT(deleteLater())); clientConnection->write(block); clientConnection->disconnectFromHost(); } ``` 读取消息 ``` void Widget::readMessage() { QDataStream in(tcpSocket); if(blockSize==0) //如果是刚开始接收数据 { //判断接收的数据是否有两字节,也就是文件的大小信息 //如果有则保存到blockSize变量中,没有则返回,继续接收数据 if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return; in >> blockSize; } if(tcpSocket->bytesAvailable() < blockSize) return; //如果没有得到全部的数据,则返回,继续接收数据 in >> message; //将接收到的数据存放到变量中 ui->messageLabel->setText(message); //显示接收到的数据 } ```
';