Qt的TCP通信模型如下:
(1)TCP服务器端
1)创建服务器套接字,使用QTcpServer()类;
2)将套接字设置为监听模式;
3)等待客户端连接请求,客户端连接上时会触发newConnection信号,可调用nextPendingConnection函数获取客户端的Socket信息;
4)和客户端进行通信,发送数据可使用write()函数,接收数据可使用read()或readAll函数()。
(2)TCP客户端
1)创建套接字;
2)连接服务器,使用connectToHost()函数;
3)和服务器进行通信,发送数据可使用write()函数,接收数据可使用read()或readAll函数()。
2 测试说明
功能说明:分别创建两个窗口,一个用作TCP服务器端,一个用作TCP客户端,双方进行通信。窗口如下:
服务器窗口: 客户端窗口:
下面分别说明代码实现的步骤:
(1)服务器端
首先创建两个套接字指针。tcpserver用作服务器套接字,tcpsocket用作和客户端通信的通信套接字。
1 QTcpServer *tcpserver = NULL; //监听套接字2 QTcpSocket *tcpsocket = NULL; //通信套接字
然后,创建套接字并启动监听。
1 //监听套接字,指定父对象,自动回收空间2 tcpserver = new QTcpServer(this);3 //启动监听4 tcpserver->listen(QHostAddress::Any, 8888);
捕捉newConnect信号与槽函数,等待客户端连接:
1 //等待连接 2 connect(tcpserver, &QTcpServer::newConnection, 3 [=]() { 4 //取出建立好连接的套接字 5 tcpsocket = tcpserver->nextPendingConnection(); 6 //获取对方的ip的端口 7 QString ip = tcpsocket->peerAddress().toString(); 8 qint16 port = tcpsocket->peerPort(); 9 QString tmp = QString("[%1:%2]:成功连接").arg(ip).arg(port);10 //在当前对话框显示谁和我连接了11 ui->textEdit_recv->setText(tmp);12 }13 );
发送数据:
1 //获取编辑区内容2 QString str = ui->textEdit_send->toPlainText();3 //给对方发送数据4 //QString -> char*5 tcpsocket->write(8().data());
接收数据:
1 //接收数据2 connect(tcpsocket, &QTcpSocket::readyRead,3 [=](){4 //从通信套接字中取出内容5 QByteArray array = tcpsocket->readAll();6 ui->textEdit_recv->append(array);7 }8 );
关闭连接:
1 //主动和客户端断开连接2 tcpsocket->disconnectFromHost();3 tcpsocket->close();4 tcpsocket = NULL;
(2)客户端
客户端只需要创建一个套接字,用于和服务器建立连接并通信:
1 QTcpSocket *tcpsocket = NULL; //通信套接字2 //分配空间,指定父对象3 tcpsocket = new QTcpSocket(this);
和服务器端建立连接:
1 //获取服务器ip和端口2 QString ip = ui->lineEdit_ip->text();3 qint16 port = ui->lineEdit_port->text().toInt();4 //主动和服务器建立连接5 tcpsocket->connectToHost(QHostAddress(ip), port);
发送数据:
1 //获取编辑框内容2 QString str = ui->textEdit_send->toPlainText();3 //发送数据4 tcpsocket->write(8().data());
接收数据:
1 connect(tcpsocket, &QTcpSocket::readyRead,2 [=](){3 //获取对方发送的内容4 QByteArray array = tcpsocket->readAll();5 //追加到编辑区中6 ui->textEdit_recv->append(array);7 }8 );
断开连接:
1 //主动和对方断开连接2 tcpsocket->disconnectFromHost();3 tcpsocket->close();
(3)完整的工程代码:
工程所包含的文件有,和是服务器端的代码,和是客户端代码。
代码:
View Code
代码:
View Code
代码:
View Code
代码:
View Code
代码,启动两个窗口:
View Code
运行进行测试: