客户端主动断开连接_干货分享:Qt下实现tcp客户端和服务器通信的过程

时间:2024-10-13 07:53:08

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

运行进行测试: