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

概要:本期主要讲解QT中对于TCP协议通信的实现。

一、TCP协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP建立连接前,需要进行三次握手,如下图所示:
在这里插入图片描述
TCP断开连接前,需要进行四次挥手,如下图所示:

在这里插入图片描述

二、Qt中TCP协议处理

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

1.QTcpSocket

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

2.QTcpServer

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

三、Qt实现TCP通信

1.客户端

客户端是发送端,主要实现与服务器端建立连接、发送数据。步骤如下:
建立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();
}

2.服务器端

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

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

}

结尾

以上就是QT中TCP通信模块的全部内容,然后上面的源码可以直接编,但是记得去PRO文件中加入network模块:)

猜你喜欢

转载自blog.csdn.net/wddkxg/article/details/129458163