赞
踩
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP建立连接前,需要进行三次握手,如下图所示:
TCP断开连接前,需要进行四次挥手,如下图所示:
Qt中提供了QTcpSocket类和QTcpServer类分别用于创建TCP套接字和TCP服务器套接字。
QTcpSocket类继承与QAbstractSocket,主要提供了socket套接字的创建、绑定端口、连接服务器等。
QTcpServer类继承于QSctpServer,主要提供了对于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; }); }); }
以上就是QT中TCP通信模块的全部内容,然后上面的源码可以直接编,但是记得去PRO文件中加入network模块:)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。