前言
通过QT的两个类(QTcpSocket)和(QTcpServer)来实现TCP通信。
这两个类属于Qt Network模块,所以先在项目文件中添加QT += network。
.pro
QT += network
一、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通信。
如有错误希望请大家指导,谢谢点赞!
希望和大家一起学习,交流!