当前位置:   article > 正文

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
#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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
#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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

结尾

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/184742?site
推荐阅读
相关标签
  

闽ICP备14008679号