Qt网络编程实现TCP通信

标签(空格分隔): Tcp通信


一、Tcp简介

  • (1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) 。

  • (2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数据报不同的是,QTcpSocket传输的是连续的数据流,尤其适合连续的数据传输,TCP一般分为客户端和服务端,即C/S (Client/Server模型)。

  • (3)QTcpSocket代表了两个独立的数据流,一个用来读取数据,一个用来写入数据,分别采用QTcpSocket::read()及QTcpSocket::write()操作,读取数据前先调用QTcpSocket::bytesAvailable来确定已有足够的数据可用。QTcpServer处理客户端的连接,可通过QTcpServer::listen()监听客户端发来的连接请求,每当有客户端连接时会发射newConnection()信号,QTcpSocket可用于读取客户端发来的数据报,亦可发送数据报。

二、传输层两大协议Tcp\Udp的异同

三、小demo实现Tcp客户端服务端通信

一、服务端:

  • 新建Qt Widgets Application,用作tcp服务端,服务端任何时候只能被动等待连接,继承自Qwidget类即可,设计ui界面,,界面如下:
  • 打开pro文件,添加支持网络编程模块,客户端也需做如下修改:
  • 添加tcp服务端m_tcpServer、tcp服务端套接字m_tcpSocket,在构造函数中监听客户端的连接,样例中服务端主要监听任何任何ip地址上的6666端口,并为客户端连接时的newConnection信号添加相应的槽函数。
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void onNewConnect();    //客户端新的连接请求处理void onSendBackMsg();   //反馈信息给客户端新的连接void onReadMsg();       //服务端读取客户端发来的数据
private:Ui::Widget *ui;QTcpServer* m_tcpServer;    //tcp服务端QTcpSocket* m_tcpSocket;    //tcp套接字
};
#endif // WIDGET_H
  • 当服务端收到客户端的连接时,服务端tcp反馈信息给客户端,同时客户端显示的数据显示到标签上:
#include "widget.h"
#include "ui_widget.h"
#include <QTcpSocket>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_tcpServer=new QTcpServer(this);//服务端监听客户端发来的请求if(!m_tcpServer->listen(QHostAddress::AnyIPv4,6666)){qDebug()<<m_tcpServer->errorString();close();}connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewConnect);connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onSendBackMsg);
}Widget::~Widget()
{delete ui;
}void Widget::onNewConnect()
{//当前连接的客户端m_tcpSocket=m_tcpServer->nextPendingConnection();//断开连接connect(m_tcpSocket,&QTcpSocket::disconnected,m_tcpSocket,&QTcpSocket::deleteLater);//socket有数据时会发送readyRead信号connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::onReadMsg);
}
void Widget::onSendBackMsg()
{QString str="你好,客户端!";m_tcpSocket->write(str.toUtf8());ui->label->setText("反馈数据成功!");}void Widget::onReadMsg()
{//服务端将客户端发来的数据显示到标签上QByteArray bt=m_tcpSocket->readAll();ui->readLabel->setText(bt);
}

二、客户端

  • 与服务端一样,再新建Qt Widgets Application项目,用作tcp客户端,继承自Qwidget类即可,设计ui界面,,界面如下:
  • 添加客户端tcp,在pro文件中添加网络编程模块network,给连接、发送按钮添加点击信号。
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void onReadMessage();   //处理服务端反馈的数据void onDisplayError(QAbstractSocket::SocketError e);    //打印错误信息void on_connectBtn_clicked();   //点击连接按钮响应信号的槽函数void on_sendBtn_clicked();  //点击发送按钮响应的槽函数
private:Ui::Widget *ui;QTcpSocket* m_tcpSocket;    //tcp客户端
};
#endif // WIDGET_H
  • 构造函数中为服务端发来数据时触发的readyRead信号添加了响应的槽函数onReadMessage,同时设置了客户端连接时的默认ip地址和端口,onReadMessage槽函数将服务端反馈的数据显示到标签上,on_sendBtn_clicked槽函数中将行编辑框中的内容发送给tcp服务端。
#include "widget.h"
#include "ui_widget.h"
#include <QAbstractSocket>
const int gTcpPort=6666;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_tcpSocket=new QTcpSocket(this);//socket有数据来了,做处理connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::onReadMessage);connect(m_tcpSocket,SIGNAL(QAbstractSocket::SocketError),this,SLOT(onDisplayError(QAbstractSocket::SocketError)));//设置客户端连接默认的主机地址及端口号ui->hostLineEdit->setText("127.0.0.1");ui->portLineEdit->setText(QString::number(gTcpPort));
}Widget::~Widget()
{delete ui;
}void Widget::onReadMessage()
{QByteArray bt;bt.resize(m_tcpSocket->bytesAvailable());m_tcpSocket->read(bt.data(),bt.size());//将客户端反馈的数据显示到标签上ui->recvLabel->setText(bt);
}void Widget::onDisplayError(QAbstractSocket::SocketError e)
{qDebug()<<"SocketError:"<<e<<endl<<m_tcpSocket->errorString();
}void Widget::on_connectBtn_clicked()
{m_tcpSocket->abort();//连接服务端m_tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());
}void Widget::on_sendBtn_clicked()
{m_tcpSocket->write(ui->sendEdit->text().toUtf8());m_tcpSocket->flush();//清空缓冲区
}

四、运行结果

  • 先打开服务端,再运行客户端

  • 客户端采用默认ip和端口,这里的ip地址也可修改为其他,端口必须与服务端监听端口一致,点击连接:

  • 在行编辑框中随便输入内容,点击发送:

ok达到目的!

Qt网络编程实现TCP通信相关推荐

  1. 嵌入式学习之QT学习---8 QT网络编程之TCP通信

    前言: Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP.F ...

  2. Java笔记整理七(网络编程,TCP通信程序,函数式接口,方法引用)

    网络编程入门 1.软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Browser/Server结构,是指浏览器和 ...

  3. 网络编程 3 tcp通信

    TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的R ...

  4. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include #include #include # ...

  5. QT网络编程——TCP服务器和客户端通信

    目录 一.服务器端 1.QT中TCP服务器的开发思路 2.QT服务器界面设计 3.QT服务器代码实现 二.客户端 1.QT中TCP客户端的开发思路 2.QT客户端界面设计 3.QT客户端代码实现 网络 ...

  6. Qt网络编程——TCP

    Qt网络编程--TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件 5. 资源下载 1. 概念 TCP(Transmission Control Protocol, 传 ...

  7. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  8. Qt网络编程-简易版UDP组播通信入门Demo(5)

    Qt网络编程-简易版UDP组播通信入门Demo(5)

  9. 第十四章:Qt网络编程

    回顾: 第一章:Qt的概述 第二章:在Ubuntu编写第一个Qt程序 第三章:Qt的字符串和字符编码 第四章:Qt的信号和槽 第五章:Qt容器窗口(父窗口) 第六章:面向对象的Qt编程 第七章:Qt设 ...

  10. Qt网络编程概述(一)

    分享主题 Qt网络编程概述(一) Qt网络编程之QTCPSocket和QTCPServer实例(二) Qt网络编程之QUdpSocket实例(三) Qt网络编程概述 QtNetWork模块提供了若干类 ...

最新文章

  1. Android重绘ListView高度
  2. R语言ggplot2可视化使用ggridges包可视化山脊图(Ridgeline Plots):山脊图(Ridgeline Plots)应用场景、受试者口服茶碱的之后观察茶碱的浓度变化的山脊图
  3. AI 的十种 “新数学”
  4. 【Paper】2012_Distributed Average Tracking of Multiple Time-Varying Reference Signals With Bounded
  5. AI公开课:19.02.27周逵(投资人)《AI时代的投资逻辑》课堂笔记以及个人感悟
  6. pip更换源 windows10_Conda及Pip换源处理
  7. lintcode-828. 字模式
  8. 将区块链哈希转化为文字标题?IPSE哈希技术Hashlink解释
  9. python 创建一个空向量_Python之Django系列-创建第一个应用-5
  10. 在java中使用关键字导入包_java的import关键字的使用
  11. 关于lidroid xUtils 开源项目
  12. 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
  13. 《Java就业培训教程》_张孝祥_书内源码_06
  14. github客户端的使用
  15. 数据库常见面试题汇总
  16. 计算机课数据排序与筛选ppt,《EXCEL 数据排序与筛选》教学设计
  17. 前后端分离框架Vue+Element UI(上集)
  18. Android破解过程-滚动的天空
  19. 计算机系统i3和i6区别,英特尔内核迭代,有i3 i5 i7,没有i4 i6吗?
  20. upload-labs上传漏洞记录

热门文章

  1. 制作OpenStack Windows Server 2016镜像
  2. Mac电脑下的单片机开发环境配置心得
  3. PCIE5.0英文版协议
  4. IDEA maven的安装与配置(超详细)
  5. bootdo mysql_iBootDo: 基于BootDo项目定制版,兼容MySQL、Oracle
  6. 大篆汉字对照表_篆书汉字对照表.pdf
  7. 如何在uniapp中使用百度云实现OCR身份证识别功能
  8. python去除pdf密码
  9. WEB小项目-账务管理系统(2020年03月24日更新,附数据库和源码包)
  10. BMFont制作美术字体包教包会