QT通信-TCP通信

本文介绍了使用Qt Network模块的QTcpSocket和QTcpServer实现TCP通信的两种服务器创建方式,包括基本的监听与连接以及自定义Server类的处理。同时概述了TCP客户端的简洁实现。适合学习QT网络编程的读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

通过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(); //创建一个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);
    //将新创建的通信套接字描述符指定为参数socketdescriptor
    tcpsocket->setSocketDescriptor(socketDescriptor);
    //将这个套接字加入客户端套接字列表中
    tcpsocketlist.append(tcpsocket);
    //将这个套接字添加到 Pending Connections 机制中。
    addPendingConnection (tcpsocket);
    /*
	需要添加的内容
	比如:接收数据和判断连接状态
	 //客户端发送数据过来就会触发readyRead信号
    connect(tcpsocket, &TcpSocket::readyRead, this, &Server::receivedata);
    //客户端断开连接触发disconnected信号
    connect(tcpsocket, &TcpSocket::disconnected, this, &Server::slotclientdisconnected);
	*/
 }
 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通信。
如有错误希望请大家指导,谢谢点赞!
希望和大家一起学习,交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值