QT TCP通信:用QT制作一个TCPServer与TCPClient的通信

这篇具有很好参考价值的文章主要介绍了QT TCP通信:用QT制作一个TCPServer与TCPClient的通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前项目上用到了TCP通信,作为TCP的服务端上位机与下位机进行控制信号传输。
这篇博客就对QT中使用TCP通信理一个简单的demo,做一个简单的TCP服务端和客户端的通信。
因为时间有限,这里就阐述一下基本原理和代码实现,具体的demo参考的是《QT5.9C++开发指南》

具体效果图如下
QT TCP通信:用QT制作一个TCPServer与TCPClient的通信,Qt学习笔记,qt,tcp/ip,开发语言


1. TCP通信原理和流程阐述

1.1 TCP 通信原理简述

TCP通信主要是三次握手和四次挥手,前者是建立连接,后者是断开连接。
QT TCP通信:用QT制作一个TCPServer与TCPClient的通信,Qt学习笔记,qt,tcp/ip,开发语言

上图是三次握手的一个基本流程图:
首先客户机向服务器申请同步,即向服务器申请连接。
服务器接收到请求,返回一个确认帧,告诉客户机已经收到你的请求,同意连接。
客户机收到同意请求信息之后,还要告诉服务器它已经收到服务器的确认请求,接下来可以传输数据。


上面是一个简单的TCP建立连接的阐述,那么回归到服务器端。在QT中,TCP服务器端使用QTcpServer用于端口监听和建立服务器,服务器和客户端之间在建立连接后,通信使用QTcpSocket,套接字Socket进行。

1.2 TCP服务端建立与通信流程

在QT中,使用QTcpServer::listen()函数开始服务器端监听,这里可以指定监听的IP地址和端口。这个表示服务器的IP和端口,监听向这个IP和端口发起请求的客户端。

当有新的客户端接入时,QTcpServer内部的incomingConnection()函数会创建一个与客户端连接的QTcpSocket对象,接着发射信号newConnection()。在newConnection()信号的槽函数中,可以用nextPendingConnection()接收客户端的连接,最后使用QTcpSocket与客户端通信。

1.3 TCP客户端通信流程

TCP客户端使用QTcpSocket与TCP服务器建立连接并通信。
客户端的QTcpSocket 实例首先通过 connectToHost()尝试连接到服务器,需要指定服务器的IP 地址和端口。
connectToHost()是异步方式连接服务器,不会阻塞程序运行,连接后发射 connected()信号。
如果需要使用阻塞方式连接服务器,则使用 waitForConnected()函数阻塞程序运行,直到连接成功或失败。
例如:

socket->connectToHost("192.168.1.100",1340);
	if(socket->waitForConnected(1000)
		qDebug("Connected!");

客户端与服务器建立socket连接后,就可以向缓冲区写数据或从接收缓冲区读取数据,实现数据的通信。当缓冲区有新数据进入时,会发射readyRead()信号,一般在此信号的槽函数里面读取缓冲区数据。


2. 关键源码阐述

2.1 服务端代码

初始化TCP服务端,绑定信号与槽函数

    QTcpServer *tcpServer; //TCP服务器
    QTcpSocket *tcpSocket;//TCP通讯的Socket

	tcpServer=new QTcpServer(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

定义了一个TcpServer的对象tcpServer,将获取的newConnection()信号绑定到自定义的槽函数onNewConnection()上。

开始监听,选择IP和端口号

void MainWindow::on_actStart_triggered()
{//开始监听
    QString     IP=ui->comboIP->currentText();//IP地址
    quint16     port=ui->spinPort->value();//端口
    QHostAddress    addr(IP);
    tcpServer->listen(addr,port);//指定ip和端口,这里的IP就是默认IP端口也是控件的默认值端口
//    tcpServer->listen(QHostAddress::LocalHost,port);// Equivalent to QHostAddress("127.0.0.1").
	...
	...
}

下面这个函数绑定了一些tcp连接的状态信号和对应的处理函数。
对于接收到的tcpServer连接,使用nextPending函数创建socket进行通信。

void MainWindow::onNewConnection()
{
//    ui->plainTextEdit->appendPlainText("有新连接");
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),
            this, SLOT(onClientConnected()));
    onClientConnected();//

    connect(tcpSocket, SIGNAL(disconnected()),
            this, SLOT(onClientDisconnected()));

    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());

    connect(tcpSocket,SIGNAL(readyRead()),
            this,SLOT(onSocketReadyRead()));
}

服务端发送数据函数:

void MainWindow::on_btnSend_clicked()
{//发送一行字符串,以换行符结束
    QString  msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();
    str.append('\n');//添加一个换行符
    tcpSocket->write(str);
}

服务器读取数据

void MainWindow::onSocketReadyRead()
{//读取缓冲区行文本
//    QStringList   lines;
    while(tcpSocket->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
//        lines.append(clientConnection->readLine());
}

2.2 客户端代码

对于客户端来说主要是socket通信

初始化客户端并绑定信号

    QTcpSocket  *tcpClient;  //socket
 	tcpClient=new QTcpSocket(this); //创建socket变量
     connect(tcpClient,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

    connect(tcpClient,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    connect(tcpClient,SIGNAL(readyRead()),
            this,SLOT(onSocketReadyRead()));

连接到服务器

    QString     addr=ui->comboServer->currentText();
    quint16     port=ui->spinPort->value();
    tcpClient->connectToHost(addr,port);

发送数据

void MainWindow::on_btnSend_clicked()
{//发送数据
    QString  msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();
    str.append('\n');
    tcpClient->write(str);
}

读取数据

void MainWindow::onSocketReadyRead()
{//readyRead()信号槽函数
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}

总结

这篇博客主要阐述了一下QT中TCP的服务端和客户端的连接与通信,以及简单收发数据。我这里把核心的逻辑提出来阐述了一下,具体的源码见绑定的资源。或者自己去异步社区下载一下书籍配套的源码。文章来源地址https://www.toymoban.com/news/detail-794404.html

到了这里,关于QT TCP通信:用QT制作一个TCPServer与TCPClient的通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt TCP简单通信

    在.pro文件中添加网络模块 Qt += network 1. 创建QTcpServer 对象,用于监听,创建套接字等; 2.进行监听,通过QTcpServer对象 QTcpServer::listen(); 3.使用信号槽,connect(), 判断是否有客户端来连接,QTcpServer::newConnection(); 4.在步骤3的基础上,创建套接字,QTcpSocket socketServer = QTcpServer:: nex

    2024年02月11日
    浏览(36)
  • Qt之TCP通信

    目录 一、TCP简介 二、TCP类 1.QTcpServer 2. QTcpSocket 三、TCP服务器 四、TCP客户端 五、获取本机网络信息 六、代码 1.TCP服务器 2.TCP客户端 TCP 协议(Transmission Control Protocol)全称是传输控制协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 。TCP是大多数 Internet 协议

    2023年04月08日
    浏览(22)
  • QT网络通信-TCP、UDP通信

    时间记录:2024/1/17 pro文件添加模块network (1)创建TCP服务器对象 QTcpServer (2)为 QTcpServer 对象的 newConnection 信号绑定槽,用来监听TCP客户端的新连接,有新的客户端连接便会触发此信号 (3)使用 nextPendingConnection 方法获取连接的Tcp客户端对象 QTcpSocket (4)为 QTcpSocket 的 r

    2024年01月18日
    浏览(59)
  • Qt TCP通信(QTcpSocket)

    下面以初始化、连接、写、读、断开连接这几个部分来介绍QTcpSocket的用法。 假设在xxx类实现tcp通信。 1、发送数据时,一次或多次发送超时,可以判断为断开连接。 2、心跳包检测(每隔一段时间发送一条无意义的数据,根据发送结果确认连接状态),TCP连接一般都要加上这

    2024年02月11日
    浏览(33)
  • Qt通信TCP/UDP

    qt socket通信,QTcpServer,QTcpSocket,QUdpSocket 链接2 链接3 链接4 QT中不再用套接字进行通信,而是使用连接对

    2024年02月09日
    浏览(40)
  • Qt实现TCP网络通信

    在标准C++中没有提供专门用于套接字通信的类,所以只能使用操作系统提供的基于C语言的API函数,基于这些C的API函数我们也可以封装自己的C++类。或者我们可以使用Qt框架,它提供了用于套接字通信的类(TCP、UDP)这样我们就可以直接调用相关API即可。 使用Qt提供的类进行基于

    2024年04月17日
    浏览(42)
  • Qt 实现简单的TCP通信

    这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程。 使用QT的网络套接字需要.pro文件中加入一句: 一、客户端 1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创

    2024年02月08日
    浏览(49)
  • 【Qt专栏】Qt实现TCP服务端和客户端通信

    网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.9.6。 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 好了,两个小程序写完并

    2024年02月12日
    浏览(37)
  • QTday5(QT连接TCP通信)

    C语言中的通信协议: 1.QT中的服务器端的操作: .pro文件: 头文件: 源文件: 2.QT中的客户端的操作: .pro文件: 头文件: 源文件:

    2024年02月09日
    浏览(30)
  • Qt 实现简单的tcp网络通信

    背景: 最近计网要结课了,匆忙之间有个计网实验还没做。 上网这里查查那里查查,随便搞搞 然后在 这篇文章里找到了能够实现的代码 自己想着把它图形化一下,最后在超级棒棒糖的帮助下实现了。 工具头文件tool.h 该头文件用于添加一些要用到的库,直接引用这个库,比

    2024年02月01日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包