qt实现服务端连接多个客户端

一、结构设计

1,组成

二、编程实现

1,主界面类

1,创建服务端

server = new Server(this, port);
connect(server, &Server::pixmapChange, this, &MonitorServer::receiveAnJianJiPixmap);
connect(server, &Server::deviceErrorInfoChange, this, &MonitorServer::showDeviceErrorInfo);
connect(server, &Server::receiveHeart, this, &MonitorServer::receiveHeart);

2,服务器类

1,监听

Server::Server(QObject* parent, int port) : QTcpServer(parent)
{
	listen(QHostAddress::Any, port);   //监听
}

2,创建套接字连接客户端

void Server::incomingConnection(qintptr socketDescriptor)
{
	//只要有新连接就生成一个新的套接字
	TcpClientSocket* tcpclientsocket = new TcpClientSocket(this);
	tcpclientsocket->setSocketDescriptor(socketDescriptor);

	//将新创建的套接字加入到客户端套接字列表中
	tcpclientsocketlist.append(tcpclientsocket);

	//接收到tcpclientsocket发过来的更新界面的信号
	connect(tcpclientsocket, &TcpClientSocket::clientDisconnected, this, &Server::slotclientdisconnect);
	connect(tcpclientsocket, &TcpClientSocket::receivePixmapMessage, this, &Server::receivePixmapMessage);
	connect(tcpclientsocket, &TcpClientSocket::receiveDeviceErrorMessage, this, &Server::receiveDeviceErrorMessage);
	connect(tcpclientsocket, &TcpClientSocket::receiveHeart, this, &Server::receiveHeartMessage);
}

3,如果有客户端断开连接,将列表中的套接字删除

void Server::slotclientdisconnect(int descriptor)
{
	for (int i = 0; i < tcpclientsocketlist.count(); i++) {
		QTcpSocket* item = tcpclientsocketlist.at(i);
		//如果有客户端断开连接,将列表中的套接字删除
		if (item->socketDescriptor() == descriptor) {
			tcpclientsocketlist.removeAt(i);
			return;
		}
	}
	return;
}

3,套接字类

1,监控是否有数据可接收,以及套接字连接状态

TcpClientSocket::TcpClientSocket(QObject* parent) : QTcpSocket(parent)
{
	//客户端发过来的数据触发readyRead信号
	connect(this, &TcpClientSocket::readyRead, this, &TcpClientSocket::recvdata);
	connect(this, &TcpClientSocket::disconnected, this, &TcpClientSocket::slotclientdisconneceted);
}

2,接收消息数据

void TcpClientSocket::recvdata()
{
	QByteArray buffer = readAll();
	messageBuffer.append(buffer);
	//解析消息
	analysisMessage();
}