开发环境:win7
开发软件:Qt5.5.0
下图是实现效果
文章图片
首先点击客户端的connect与服务器连接,连接成功后再服务器会显示“成功连接”,然后在客户端会显示“成功与服务器建立连接”,然后我们就可以分别在服务器和客户端向对方发送数据了。
1 TCP介绍 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
在QT中的网络编程的过程如下:服务器有两个套接字,一个负责监听(QTcpServer),另一个负责通信(QTcpSocket),而客户端只有一个负责通信的套接字(QTcpSocket)。
通信过程如下图:
文章图片
2 Tcp服务器实现
//监听套接字,指定父对象,让其自动回收空间
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::AnyIPv4, 6000);
当有新的连接建立时,在服务器界面接收区处显示客户端地址和端口,并且等待数据发送过来,接收并显示:
connect(tcpServer, &QTcpServer::newConnection,
[=](){
//取出建立好连接的套接字
//cout << "有新的客户端进行连接";
tcpSocket = tcpServer->nextPendingConnection();
//获取对方的IP和端口
QString ip = tcpSocket->peerAddress().toString();
quint16 port = tcpSocket->peerPort();
QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
ui->textEditRead->setText(temp);
connect(tcpSocket, &QTcpSocket::readyRead,
[=](){
//cout << "有数据从客户端发过来";
//从通信套接字取出内容
QByteArray array = tcpSocket->readAll();
ui->textEditRead->append(array);
}
);
}
);
}
发送数据:
void ServerWidget::on_buttonSend_clicked()
{
if(NULL == tcpSocket){
return;
}
//获取编辑区内容
QString str = ui->textEditWrite->toPlainText();
//给对方发送数据。使用套接字是tcpSocket
tcpSocket->write(str.toUtf8().data());
}
点击close按钮,如果tcpSocket没有分配内存,则退出,否则断开连接。
void ServerWidget::on_buttonClose_clicked()
{
if(NULL == tcpSocket){
return;
}
//主动和客户端断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
}
3 TCP客户端实现 分配空间,指定父对象
tcpSocket = new QTcpSocket(this);
【C++|基于QT实现简单的TCP通信】如果服务器发送连接成功,则客户端显示“成功与服务器建立连接”。
connect(tcpSocket, &QTcpSocket::connected,
[=](){
ui->textEditRead->setText("成功与服务器建立连接");
}
);
客户端读取数据,并显示在接收区
connect(tcpSocket, &QTcpSocket::readyRead,
[=](){
//获取服务器发送的内容
QByteArray array = tcpSocket->readAll();
ui->textEditRead->append(array);
}
);
按下connect按钮,主动与服务器建立连接
void ClientWidget::on_pushButtonConnect_clicked()
{
//获取服务器ip和端口
QString ip = ui->lineEditIP->text();
quint16 port = ui->lineEditPort->text().toInt();
//主动和服务器建立连接
tcpSocket->connectToHost(QHostAddress(ip), port);
}
按下send按钮,发送数据,转成utf-8格式
void ClientWidget::on_pushButtonSend_clicked()
{
if(NULL == tcpSocket){
return;
}
//获取编辑区内容
QString str = ui->textEditWrite->toPlainText();
//给对方发送数据,使用套接字是tcpSocket
tcpSocket->write(str.toUtf8().data());
}
按下close关闭连接
void ClientWidget::on_pushButtonClose_clicked()
{
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
推荐阅读
- QT|Qt实现隐藏按钮功能
- 十万个为什么|为什么需要TCP加速(TCP怎么加速呢?)
- QT|QT实现TCP通信
- [Qt学习笔记]Qt实现多摄像头的识别、显示、截图、分辨率帧率设置等功能
- 菜鸟刷题|蓝桥杯每日一题——最大字段和问题(动态规划)
- 算法|leetcode378. 有序矩阵中第 K 小的元素
- c++|《每日一题》面试题 02.07. 链表相交
- tcp/ip|TCP、IP 、HTTP——深入学习TCP协议
- 网络知识学习|从0开始的网络学习——IP、DNS、服务器