文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Qt中的TCP通信

2023-09-04 13:37

关注

一、TCP的特点

TCP(传输控制协议)是一种面向连接的,可靠的,基于字节流的传输层通信协议

二、TCP适合应用的场景

TCP协议适用于要求可靠传输的应用,例如文件传输,网络数据库,分布式高精度计算系统的数据传输。

三、Qt中使用TCP通信

Qt中的TCP通信与之前所讲的UDP通信有着明显区别,使用TCP通信,就有着明确的客户端与服务器之分,服务器有两个套接字,分别是一个用于通信的通信套接字(QTcpSocket),一个是用于监听的监听套接字(QTcpServer),客户端只有一个用于通信的通信套接字(QTcpSocket),基本流程是客户端首先得向服务器发送连接请求,服务器监听到有客户端向它发送连接请求时,会触发newConnection信号,与此同时,客户端会触发connected信号,表示与服务器成功连接,两者建立好连接之后,服务器需要返回一个通信套接字用于和客户端通信,随后客户端与服务器就可以通过通信套接字来进行数据之间的通信

四、客户端与服务器通信的实现

添加网络模块

QT += network;

添加头文件

#include //通信套接字#include //监听套接字

服务器端的实现

tcpserver分配空间,指定父对象,然后开始监听

tcpserver = new QTcpServer(this); //分配空间,指定父对象tcpserver->listen(QHostAddress::Any,8888);//监听本机所有网口及8888端口号

一旦监听到有客户端发起了连接请求,服务器端触发newConnection信号,与此同时,客户端会触发connected信号,服务器返回一个建立好连接的通信套接字,当客户端发送数据时,服务器端会触发readyRead信号,取出tcpsocket中的数据,显示到窗口中,实现接收数据

客户端返回一个建立好连接的通信套接字一般使用如下函数

tcpsocket = tcpserver->nextPendingConnection();

 完整代码

connect(tcpserver,&QTcpServer::newConnection,[=] //Server监听到连接请求触发newConnection信号    {        tcpsocket = tcpserver->nextPendingConnection();//Client与Server建立连接后,Server返回一个建立好连接用于通信的套接字        QString ip = tcpsocket->peerAddress().toString();//获取对方的IP        qint16 port = tcpsocket->peerPort();//获取对方的端口        QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");//获取当前时间        ui->te_output->append(time+"\n"+QString("成功与[%1:%2]建立连接...").arg(ip).arg(port));        connect(tcpsocket,&QTcpSocket::readyRead,[=] //接收数据        {            QString message = tcpsocket->readAll();           QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");           ui->te_output->append(time + "\n"+message);        });    });

发送数据,使用write()函数,因为已经建立好了连接,所以参数可以只有一个,就是你想发送的数据

//获取用户输入的信息    QString text = ui->te_input->toPlainText();    tcpsocket->write(text.toUtf8().data());

断开连接,使用disconnectFromHost();

tcpsocket->disconnectFromHost();//主动和客户端断开连接tcpsocket->close();tcpsocket = NULL;

客户端的实现

客户端向服务器发送连接请求

第一个参数是服务器的IP地址,第二个参数是服务器的端口号

tcpsocket->connectToHost(QHostAddress(peerip),peerport);

客户端成功连接服务器,触发connected信号,触发相应槽函数

connect(tcpsocket,&QTcpSocket::connected,[=] //客户端成功建立连接后触发connected信号    {        QString str = QString("成功与[%1:%2]建立连接...").arg(peerip).arg(peerport);        QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");        ui->te_output->append(time+"\n"+str);    });

客户端的发送与接收数据与服务器端是相同的,就不再过多阐述了

发送数据

//获取用户输入的信息QString text = ui->te_input->toPlainText();tcpsocket->write(text.toUtf8().data());

接收数据

connect(tcpsocket,&QTcpSocket::readyRead,[=]    {       QString message = tcpsocket->readAll();       QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");       QString name = tcpsocket->peerName();       ui->te_output->append(time + "\n"+name+":"+message);    });

断开连接时tcpsocket会触发disconnected信号

 connect(tcpsocket,&QTcpSocket::disconnected,[=]    {        QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");        ui->te_output->append(time + "\n"+"与服务器断开连接...");    });

程序演示

建立连接

 互相发送数据

断开连接

 

客户端与服务器端都可以主动与对方断开连接,断开连接后,双方就不能进行通信了

我是龙木南,这篇文章对你有帮助的话~就点个赞把~

点赞关注收藏就是对我最大的支持~

来源地址:https://blog.csdn.net/m0_71741835/article/details/127613418

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯