QT实现简单TCP通信

本文实例为大家分享了QT实现简单TCP通信的具体代码,供大家参考,具体内容如下

开发环境: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);

如果服务器发送连接成功,则客户端显示“成功与服务器建立连接”。

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();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

随机推荐

  • JS中 用户登录系统的解决办法
  • FTP无法删除的文件的分析
  • cnct.batch 批处理不错的东西%cd%
  • IOS多线程实现多图片下载(一)
  • ASP.NET设置404页面返回302HTTP状态码的解决方法
  • 关于UEditor编辑器远程图片上传失败的解决办法
  • NodeJS中利用Promise来封装异步函数
  • php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
  • C#设计模式之Strategy策略模式解决007大破密码危机问题示例
  • Android布局技巧之创建高效布局
  • PHP中curl_setopt函数用法实例分析
  • 详解vue-router和vue-cli以及组件之间的传值
  • 浅析Nodejs npm常用命令
  • MySQL数据库的高可用方案总结
  • JQuery判断radio是否选中并获取选中值的示例代码
  • Mongoose学习全面理解(推荐)
  • C#验证身份证号码正确性的实例代码(收藏)
  • 优园网为您提供免费300M空间
  • Android利用MPAndroidChart绘制曲线图表的基础教程
  • android 布局之ConstraintLayout的使用

深圳SEO优化公司企业网站的搜索引擎优化工作步骤襄阳外包网站优化哪家好洪雅县网站关键词优化邯郸百度快照网站优化瓷砖行业网站优化推广可靠吗网站几年了没有排名怎么优化常州市网站关键词优化哪家好优化大师正确版本下载网站是多少网站建设网站优化哪家好外贸网站优化步骤深圳网站推广排名优化河东区网站优化怎么做郑州seo网站有优化鄂州网站综合优化巩义百度网站优化价格多少铁岭网站优化与推广案例网站关键词如何优化洞桥优化网站哪家好网站云优化工具网站优化被骗了怎么办优化网站哪个方法好罗湖网站快照排名优化公司通化网站优化有哪些成都网站优化 鹊起科技seo网站优化方案案例热门网站优化系统加盟平台汕头网站首页关键词优化技巧盐城网站优化诚信商家网站优化平台排行榜广州网站seo优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化