【Qt网络编程】实现TCP协议通信

本文介绍了如何在QT框架下使用TCP协议进行通信,包括TCP协议的基本概念,QT中的QTcpSocket和QTcpServer类的使用,以及客户端和服务器端的实现步骤,展示了建立连接、发送和接收数据的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

🌟TCP协议概述

  • 定义:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
  • 特点:
    (1)基于流的方式;
    (2)面向连接;
    (3)可靠通信方式;
    (4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
    (5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
  • 报文格式:
    在这里插入图片描述
  • 连接方式:
    TCP建立连接前,需要进行三次握手,如下图所示:
    在这里插入图片描述
  • 对于握手时存在的报文丢失问题,TCP提供超时重传机制,通过计算报文往返时延以及报文的应答状态,来选择是否重新发送报文。
    TCP断开连接前,需要进行四次挥手,如下图所示:

在这里插入图片描述

🌟Qt中TCP协议处理

  • Qt中提供了QTcpSocket类和QTcpServer类分别用于创建TCP套接字和TCP服务器套接字。

💥QTcpSocket

  • QTcpSocket类继承与QAbstractSocket,主要提供了socket套接字的创建、绑定端口、连接服务器等。
    QAbstractSocket类

💥QTcpServer

  • QTcpServer类继承于QSctpServer,主要提供了对于TCP连接信号的响应和监听等。
    QTcpServer

🌟Qt实现TCP通信

💥客户端

  • 客户端是发送端,主要实现与服务器端建立连接、发送数据和接收数据。步骤如下:
    建立TCP套接字 --> 连接服务器 --> 发送数据/接收数据
    下面是客户端的源码:
#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QObject>
#include <QTcpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QTimer>

class TCPClient : QObject
{
    Q_OBJECT
public:
    TCPClient();

    void InitSocket();//初始化Socket套接字

    void InitTimer();//初始化定时器,定时发送

    void ConnectToServer();//连接服务器

    void SendData();//发送数据

private:
    QTcpSocket *mTcpSocket;//Tcp连接套接字
    QHostAddress mServerAddress;//服务器IP
    QTimer *mTimer;//定时器对象

};

#endif // TCPCLIENT_H

#include "tcpclient.h"

TCPClient::TCPClient()
{
    InitSocket();
    ConnectToServer();
    InitTimer();

}

void TCPClient::InitSocket()
{
    mTcpSocket = new QTcpSocket;//初始化Tcp连接套接字
    mServerAddress.setAddress("10.0.0.177");//设置服务器地址
}

void TCPClient::InitTimer()
{
    mTimer = new QTimer;//初始化定时器对象
    connect(mTimer,&QTimer::timeout,this,[=]
    {
        SendData();
    });
    mTimer->start(1000);//每隔一秒发送一次数据
}

void TCPClient::ConnectToServer()
{
    quint16 _port = 7777;//设置服务器端口
    connect(mTcpSocket,&QTcpSocket::connected,this,[=]{
        qDebug()<< "Connect To Server Successful!"<<endl;
    });
    mTcpSocket->connectToHost(mServerAddress,_port,QIODevice::WriteOnly);//连接服务器

}

void TCPClient::SendData()
{
    QByteArray _data = "hello";
    if(-1 != mTcpSocket->write(_data.data(),_data.length()))
    {
        qDebug()<< "TCP ==> Send data : "<< _data<<endl;
    }
    mTcpSocket->flush();
}

💥服务器端

  • 服务器端是接收端,主要实现监听连接信号,建立连接、接收数据和发送数据。步骤如下:
    建立监听套接字 --> 连接到客户端 --> 获得连接套接字 --> 接收数据/发送数据
    下面是服务器端源码:
#ifndef TCPSEVER_H
#define TCPSEVER_H

#include <QObject>
#include <QHostAddress>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>

class TCPSever : QObject
{
    Q_OBJECT
public:
    TCPSever();
    void InitServer();//初始化服务器
private:
    QTcpServer *mTcpServer;//服务器对象
    QTcpSocket *mTcpSocket;//客户端套接字
    QHostAddress mHostAddress;//本地IP地址

};

#endif // TCPSEVER_H
#include "tcpsever.h"

TCPSever::TCPSever()
{
    InitServer();
}

void TCPSever::InitServer()
{
    mTcpServer = new QTcpServer(this);//初始化监听套接字
    mTcpSocket = new QTcpSocket;//初始化连接套接字
    mHostAddress.setAddress("10.0.0.177");//设置监听网卡IP
    quint16 _port = 7777;//设置监听端口
    mTcpServer->listen(mHostAddress,_port);//监听指定网卡和端口
    qDebug()<<"Listen Interface ["<<mHostAddress.toString()<<"] And Port ["<<_port<<"] Successful!"<<endl;
    connect(mTcpServer,&QTcpServer::newConnection,this,[=]{
        mTcpSocket = mTcpServer->nextPendingConnection();//获取连接套接字
        qDebug()<<"Connect To Client Successful!"<<endl;

        connect(mTcpSocket,&QTcpSocket::readyRead,this,[=]{//读取消息
            QByteArray _data = mTcpSocket->readAll();
            qDebug()<<"TCP Receive Data : "<<QString::fromLatin1(_data)<<endl;
        });
    });

}

🌟补充

  1. 以上只是一个简单的TCP测试demo,只能实现正常通信情况下的数据收发功能。
  2. 在正常的项目开发中,需要处理特殊场景下,TCP通信的应对方案。
  3. 有兴趣的读者,可以尝试在测试代码的基础上添加一些额外的模块,例如:连接存活检测以及自动重连机制、异步I/O和事件驱动模型、线程池和连接池处理等
  4. 后续我会逐步更写网络编程进阶的文章:)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

葛狂的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值