QT之TCP通信
QT之TCP通信
QT中可以通过TCP协议让服务器和客户端之间行通信。所以下面我就围绕服务器和客户端来写。
这是我们写服务器和客户端的具体流程:
A、服务器:
1。创建QTcpServer对象
2。启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
3。当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
4。QTcpsocket发送数据用成员方法write,
5。读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据
B、客户端:
1。创建QTcpSocket对象
2。链接服务器connectToHost(QHostAddress(ip),端口号)
3。QTcpsocket发送数据用成员方法write,
4。读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据【相关文章推荐】
点击领取Qt开发进阶技术栈学习路线资料
我们需要调用到的头文件有两个:includeQTcpServerincludeQTcpSocket
我们先要在工程文件中加入networkQTcoreguinetwork
下面我们来看看服务器程序步骤:
1、初始化服务器server对象mServernewQTcpServer();
2、启动监听服务器mServerlisten(QHostAddress::Any,9988);9988为端口号
3、当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)connect(mServer,SIGNAL(newConnection()),this,SLOT(newclient()));mSocketmServernextPendingConnection();与客户端通信的套接字
4、发送数据mSocketwrite(msg。toUtf8());
5、读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据connect(mSocket,SIGNAL(readyRead()),this,SLOT(readclientdata()));
6、连接多个客户端可以实现同时读取多个客户端发送过来的消息QTcpSocketobj(QTcpSocket)sender();
7、检测掉线connect(mSocket,SIGNAL(disconnected()),this,SLOT(clientdis()));检测掉线信号
下面是服务器的实现的具体代码:includetcpserver。hincludeuitcpserver。hincludeQDebugTcpServer::TcpServer(QWidgetparent):QMainWindow(parent),ui(newUi::TcpServer){uisetupUi(this);初始化服务器server对象mServernewQTcpServer();关联客户端连接信号newConnectionconnect(mServer,SIGNAL(newConnection()),this,SLOT(newclient()));连接客户端启动服务器监听mServerlisten(QHostAddress::Any,9988);}TcpServer::TcpServer(){deleteui;}voidTcpServer::newclient(){qDebug()新客户段连接;mSocketmServernextPendingConnection();与客户端通信的套接字关联接收客户端数据信号readyRead信号(客户端有数据就会发readyRead信号)connect(mSocket,SIGNAL(readyRead()),this,SLOT(readclientdata()));检测掉线信号connect(mSocket,SIGNAL(disconnected()),this,SLOT(clientdis()));}voidTcpServer::readclientdata(){可以实现同时读取多个客户端发送过来的消息QTcpSocketobj(QTcpSocket)sender();QStringmsgobjreadAll();qDebug()msg;}voidTcpServer::clientdis(){QTcpSocketobj(QTcpSocket)sender();掉线对象qDebug()objpeerAddress()。toString();打印出掉线对象的ip}
说完服务器那我们继续来看看客户端是怎么实现的:
1、创建QTcpSocket对象【相关文章推荐】
点击领取Qt开发进阶技术栈学习路线资料mSocketnewQTcpSocket();
2、链接服务器connectToHost(QHostAddress(ip),端口号),连接服务器ip和端口号mSocketconnectToHost(uiipEdittext(),uiportEdittext()。toInt());uiipEdittext():ip,uiportEdittext()。toInt():端口号
3、发送数据取发送信息编辑框内容QStringmsguisendEdittoPlainText();mSocketwrite(msg。toUtf8());转编码
4、检测链接成功信号关联槽函数connect(mSocket,SIGNAL(connected()),this,SLOT(connectsuc()));
5、检测掉线信号connect(mSocket,SIGNAL(disconnected()),this,SLOT(clientdis()));
6、服务器和客户端关闭都可以使用closemSocketclose();
这是客户端实现的具体代码includetcpclient。hincludeuitcpclient。hincludeQDebugTcpClient::TcpClient(QWidgetparent):QMainWindow(parent),ui(newUi::TcpClient){uisetupUi(this);初始化套接字对象mSocketnewQTcpSocket();关联数据信号connect(mSocket,SIGNAL(readyRead()),this,SLOT(readdata()));}TcpClient::TcpClient(){deleteui;}voidTcpClient::readdata(){QStringmsgmSocketreadAll();qDebug()msg;}voidTcpClient::onbtnconnectServerclicked(){检测链接成功信号关联槽函数connect(mSocket,SIGNAL(connected()),this,SLOT(connectsuc()));检测掉线信号connect(mSocket,SIGNAL(disconnected()),this,SLOT(clientdis()));连接服务器,设置ip和端口号mSocketconnectToHost(uiipEdittext(),uiportEdittext()。toInt());}voidTcpClient::onbtnsendclicked(){取发送信息编辑框内容QStringmsguisendEdittoPlainText();mSocketwrite(msg。toUtf8());转编码}voidTcpClient::connectsuc(){uibtnconnectServersetEnabled(false);如果连接成功则连接按钮不能按下}voidTcpClient::clientdis(){uibtnconnectServersetEnabled(true);如果连接没有成功则连接按钮还可以按下}
这是服务器和客户端分开两个文件夹写的程序,在这里我也实现了服务器和客户端写在同一个文件中
具体代码如下:
头文件:tcpapp。h
ViewCode
源文件:tcpapp。cpp
ViewCode
界面文件tcpapp。ui如下图
此外这里还使用到了容器,在这里讲讲容器的使用
1、定义容器对象QVectorQTcpSocketclients;存储所有在线客户端(容器)解释:QTcpSocke容器的类型clients容器名
2、往容器中添加成员上线用户添加到客户列表容器clients。append(mSocket);
3、寻找某个成员在容器中位置introwclients。indexOf(obj);找到掉线对象的内容所在的行
4、从容器中删除成员clients。remove(row);从容器中删除成员
如果你对QT开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!
世界杯看球房火了,近一周主题酒店预订量增长逾2。5倍张先生是一位80后,这几天他都住在酒店。想看世界杯比赛,但是晚上又怕吵到家里人,所以就在家附近找了一家比较平价的酒店,晚上也比较自由。类似张先生这样近期入住酒店观赛的住客不少,各地
江西省吉安市峡江县玉笥山(11)20201124峡江玉笥山位于江西省吉安市峡江县水边镇何君村西,东临105国道和京九铁路穿腹而过,原名群玉山。大诗人李白江南之行,从匡庐游至群玉山时,见峰峦连绵不绝。位于峡江县城西
中日千年史日本为何要热衷于征服中国呢?头条创作挑战赛中日关系源远流长,曾经有着一段令人称赞的蜜月期。可自甲午战争以来,中日关系急转直下,已经没有了任何的友谊可言了。不仅没有友谊可言,还受到日本极端分子的影响,让两国成为
五星出东方利中国一个千年的神奇预言五星出东方利中国1995年,中日尼雅遗址学术考察队在新疆和田民丰县进行考古挖掘,这里便是昔日的尼雅古国。当考古人员挖开尼雅古国的一处古墓时,考古人员一阵欢呼,发现了什么?会使他们如
成都有座冷门古镇,保存着大量明清古建筑,还有12棵千年古树头条创作挑战赛在成都这座城市中古镇,古街非常的多,在市中心有全国都赫赫有名的宽窄巷子,锦里古街作为代表,在成都周边拥有黄龙溪古镇,洛带古镇,街子古镇等大批的代表古镇,如今这些古镇都
第三届郎静山摄影艺术周启动千年古镇促两岸交流开幕式现场。丁成摄中新网金华11月26日电(张斌陈志恒)11月26日,第三届郎静山摄影艺术周暨浙江省摄影之乡工作现场会活动在浙江金华兰溪的千年古镇游埠启动,知名摄影艺术家摄影爱好者
所有走过的路,遇到的人,都有他存在的意义早上好?不好不好早上真的好吗?为了上班在狗狗都没醒的早上要逼自己起床又香又软的被窝不好吗?非要早上好一点也不好太困了二十岁的酸楚或许在三十岁会有答案三十岁的困惑到四十岁或许就解开了
我只想用一条粗长的绳缠住我36码的脚缠住夺眶而出的白月光静默作者梧桐雨等不来烟花三月的从天而降等不来旋转的碎花裙等不来二月春风的敲门声我只是静默,静默而已窗外的枯叶,无精打采经不住来回的折腾说不出你的来意说不出真诚的话我只想用一条粗长的
雷丁汽车获得32亿元A轮融资,山东省内国资跟投(文潘昱辰编辑周远方)11月21日,雷丁汽车宣布完成A轮融资,整体融资规模为32亿元,将于11月底开始陆续到位。雷丁方面表示,此次融资由潍坊市潍城西部投资发展集团领投,来自山东省内
知恩于心,暖心于怀山东齐鲁技工学校开展感恩感谢活动(一)知恩于心暖心于怀拥有一颗感恩的心,才懂得去孝敬父母拥有一颗感恩的心,才懂得去关心帮助他人拥有一颗感恩的心,才会勤奋学习,真爱自己拥有一颗感恩的心,才能学会包容,赢得友谊拥有一颗感恩
蓉妹妹小剑哥房车旅行之山东人太好客了关注乡土沂蒙,每天用文字向你介绍自媒体网红台前幕后的故事。小剑哥和蓉妹妹都是内蒙人,小剑哥是鄂尔多斯人,蓉妹妹是乌海人。两个人因为相同的爱好,共同自驾房车开始旅游,在旅游的过程中拍