文章目录
- 概要:本期主要讲解QT中对于TCP协议通信的实现。
- 一、TCP协议
- 二、Qt中TCP协议处理
- 1.QTcpSocket
- 2.QTcpServer
- 三、Qt实现TCP通信
- 1.客户端
- 2.服务器端
- 结尾
概要:本期主要讲解QT中对于TCP协议通信的实现。
一、TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP建立连接前,需要进行三次握手,如下图所示:
TCP断开连接前,需要进行四次挥手,如下图所示:
二、Qt中TCP协议处理
Qt中提供了QTcpSocket类和QTcpServer类分别用于创建TCP套接字和TCP服务器套接字。
1.QTcpSocket
QTcpSocket类继承与QAbstractSocket,主要提供了socket套接字的创建、绑定端口、连接服务器等。
2.QTcpServer
QTcpServer类继承于QSctpServer,主要提供了对于TCP连接信号的响应和监听等。
三、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模块:)