基于QT的TCP通讯实现

本文介绍了TCP协议的主要特点,如面向连接、可靠交付等,并详细阐述了TCP连接的端点——套接字的概念。通过图解展示了TCP编程模型,描述了服务器启动、客户端连接、数据交换的过程。最后,文章讲解了如何在QT中利用QTcpSocket和QTcpServer类实现TCP通信,提供了服务器和客户端的实现文件概览。
摘要由CSDN通过智能技术生成

TCP协议概述

主要特点

1.TCP是面向连接的运输层协议。应用和曾许在使用TCP协议之前,必须首先建立TCP连接。在传输数据完毕之后,必须将已经建立好的TCP给释放。也就是说,应用进程之间的通信好像在“打电话”:通话之前首先要拨通号码建立连接,通话结束之后必须挂掉电话释放连接。

2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。

3.TCP提供的是可靠交付的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,按照顺序到达。

4.TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能够发送数据。TCP连接的两端都设置了发送缓冲和接收缓冲区用来临时存放双向通信的数据。在发送时候,应用程序把数据传送给TCP的缓存之后,就可以去干自己的事情了,TCP会在合适的时候把数据发送出去。在接收的时候,TCP会把收到的数据放入缓存,上层应用进程在合适的时候会读取缓冲区的数据。

5.面向字节流。

TCP的连接

TCP把连接作为最基本的抽象。TCP的许多特性都和TCP是面向连接的这个基本特性有关。

前面已经讲过,每一条TCP连接有两个端点。那么,TCP连接的端点是什么呢》

他叫做套接字(Socket),具体的定义为:端口拼接到IP地址即构成套接字。因此套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间使用冒号或者逗号隔开。例如,若IP地址是192.168.3.4 而端口号是50,那么得到的套接字就是(192.168.3.4:50)。

                                                        套接字Socket = IP地址:端口号   

每一条TCP连接唯一地被通讯两端的两个套接字所确定。

TCP的编程模型

程序编写的流程图如图所示。

首先是启动服务器,一段时间之后启动客户端,它与此服务器经过三次握手后建立连接。在此后的一段时间内,客户端向服务器发送一个强求,服务器处理这个请求,并为客户端发回一个响应。这个过程会一直持续下去,直到客户端为服务器发

Qt中,可以使用QTcpServer和QTcpSocket类来实现TCP通讯QTcpServer类用于创建TCP服务器,它可以监听指定的端口并等待客户端连接。当有客户端连接时,QTcpServer会创建一个QTcpSocket对象来处理该客户端通讯。 以下是一个简单的QTcpServer示例: ```cpp // 创建TCP服务器 QTcpServer* server = new QTcpServer(this); // 监听端口 if (!server->listen(QHostAddress::Any, 1234)) { qDebug() << "Error: " << server->errorString(); return; } // 处理新连接 connect(server, &QTcpServer::newConnection, [=]() { QTcpSocket* socket = server->nextPendingConnection(); // 处理socket的通讯 }); ``` QTcpSocket类用于创建TCP客户端,它可以连接到指定的服务器地址和端口,并发送和接收数据。 以下是一个简单的QTcpSocket示例: ```cpp // 创建TCP客户端 QTcpSocket* socket = new QTcpSocket(this); // 连接服务器 socket->connectToHost(QHostAddress("127.0.0.1"), 1234); // 等待连接成功 if (!socket->waitForConnected()) { qDebug() << "Error: " << socket->errorString(); return; } // 发送数据 socket->write("Hello, server!"); socket->flush(); // 接收数据 connect(socket, &QTcpSocket::readyRead, [=]() { QByteArray data = socket->readAll(); qDebug() << "Received data: " << data; }); ``` 需要注意的是,QTcpSocket的通讯是基于事件驱动的,因此需要通过信号槽连接来处理数据的接收和发送。另外,QTcpSocket还提供了一些其他的函数来控制通讯的状态和参数,如setSocketOption、setReadBufferSize等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程芝士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值