Qt实现tcp通信(QTcpServer和QTcpSocket的应用)详细教程
服务端
监听地址和端口
ip可以是Ipv4Any,本机地址,也可以是固定的某个ip
端口号则作为服务端绑定的端口,客户端连接服务端时需要连接到服务端绑定的端口,端口不对连接失败m_server=new QTcpServer(this); m_server->listen(QHostAddress::AnyIPv4,serverPort);
监听连接
监听连接信号,当有新连接到来时会触发,可以通过nextPendingConnection()接口获取新连接来的QTcpSocket,后续通过此QTcpSocket和对应的客户端收发消息connect(m_server,&QTcpServer::newConnection,[this](){ if(m_server->hasPendingConnections()) { m_socket=m_server->nextPendingConnection(); } });
读写数据
connect(m_socket,&QTcpSocket::readyRead,[this](){ auto data=m_socket->readAll(); }); m_socket->write(data);//发送数据 m_socket->flush();//可以使数据立即发送出去,无需等其他方面的调度
客户端
连接服务端
auto socket=new QTcpSocket(this); socket->connectToHost(serverIp,serverPort); if (socket->waitForConnected(3000)) { // 最多等待 3 秒 qDebug() << "Connected to server!"; } else { qWarning() << "Connection failed:" << socket->errorString(); }
读写数据用法同上
connect(m_socket,&QTcpSocket::readyRead,[this](){ auto data=m_socket->readAll(); }); m_socket->write(data);//发送数据 m_socket->flush();//可以使数据立即发送出去,无需等其他方面的调度
注意点
QTcpSocket发送的数据如果不及时读取的话,数据会堆叠在一起,下次接收时可能读取的是多次发送的数据,因此需要注意设置一些分割标识,便于堆叠数据的拆分。