前言
通过QT的两个类(QTcpSocket)和(QTcpServer)来实现TCP通信。
这两个类属于Qt Network模块,所以先在项目文件中添加QT += network。 .pro
QT += network
详细请见官网Qt Network 模块提供允许您编写 TCP/IP 客户端和服务器的类。它提供了代表低级网络概念的低级类,如QTcpSocket、QTcpServer和QUdpSocket,以及高级类如QNetworkRequest、QNetworkReply和QNetworkAccessManager以使用通用协议执行网络操作。它还提供了 QNetworkConfiguration、QNetworkConfigurationManager 和 QNetworkSession 等实现承载管理的类。
一、TCP服务端
第一种创建方式
在服务器应用程序中,创建一个QTcpServer类对象。调用QTcpServer::listen () 设置服务器,并连接到QTcpServer::newConnection () 信号,该信号每个新连接的客户端发出一次。并调用QTcpServer::nextPendingConnection () 接受连接并使用返回的QTcpSocket与客户端进行通信。
void MainWindow::my_TcpServer(int port)
{
server = new QTcpServer();
server->listen(QHostAddress::Any, port);
connect(server,&QTcpServer::newConnection,this,&MainWindow::do_newConnect);
}
void MainWindow::do_newConnect()
{
socket = server->nextPendingConnection();
}
第二种创建方式
基于QTcpServer类,创建一个子类,通过该写QTcpServer类中Protected Functions的虚函数 来实现一些自己想要的内容。 virtual void incomingConnection(qintptr socketDescriptor) 当新连接可用时,QTcpServer会调用此虚拟函数。该socketDescriptor参数是接受的连接本地套接字描述符。 基本实现创建一个QTcpSocket,设置套接字描述符,然后将QTcpSocket存储在挂起连接的内部列表中。最后发出newConnection ()。 重新实现此函数以在连接可用时更改服务器的行为。 在这里我们改写这个函数:
Server::Server(QObject *parent, int port):QTcpServer(parent)
{
listen(QHostAddress::Any, port);
}
void Server::incomingConnection(int socketDescriptor)
{
TcpSocket *tcpsocket = new TcpClientSocket(this);
tcpsocket->setSocketDescriptor(socketDescriptor);
tcpsocketlist.append(tcpsocket);
addPendingConnection (tcpsocket);
}
void Server::sendDataToClient(QByteArray myData)
{
if (!tcpsocketlist.empty()){
for(int i = 0; i < tcpsocketlist.count(); i++)
{
QTcpSocket *item = tcpclientsocketlist.at(i);
item->write(myData);
}
}
}
然后在主程序创建Server对象和绑定自己设置的信号就行
void MainWindow::init_tcp()
{
my_server = new Server(this,9003);
connect(my_server, &Server::update, this, &MainWindow::do_update);
}
二、TCP客户端
TCP客户端相对简单; 创建套接字 socket = new QTcpSocket(); 连接服务器 socket->connectToHost(ip, port); 发送数据 socket->write(myData);
总结
具体程序见:https://download.csdn.net/download/qq_39641107/41320871 上面是我运用QT的TCP类,建立的TCP通信。 如有错误希望请大家指导,谢谢点赞! 希望和大家一起学习,交流!
|