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);
//显示接收到的数据
}
```
';