要实现一个多对多的TCP服务器,你可以使用Qt框架提供的QTcpServer和QTcpSocket类。下面是一个简单的示例代码,演示如何使用Qt实现多对多TCP服务器:
#include <QtNetwork>
class MyServer : public QTcpServer
{
Q_OBJECT
public:
MyServer(QObject *parent = nullptr) : QTcpServer(parent)
{
// 监听所有网络接口上的任意可用端口
listen(QHostAddress::Any, 1234);
}
protected:
void incomingConnection(qintptr socketDescriptor) override
{
// 创建一个新的socket连接,并将其加入到连接列表中
QTcpSocket *clientSocket = new QTcpSocket(this);
// 根据socket描述符设置套接字
if (clientSocket->setSocketDescriptor(socketDescriptor))
{
qDebug() << "New connection established: " << clientSocket->peerAddress().toString();
// 将连接加入到连接列表中
m_connections.append(clientSocket);
connect(clientSocket, &QTcpSocket::readyRead, this, &MyServer::onReadyRead);
connect(clientSocket, &QTcpSocket::disconnected, this, &MyServer::onDisconnected);
}
else
{
qWarning() << "Failed to set socket descriptor";
delete clientSocket;
}
}
private slots:
void onReadyRead()
{
QTcpSocket *sender = qobject_cast<QTcpSocket*>(QObject::sender());
while (sender->bytesAvailable() > 0)
{
QByteArray data = sender->readAll();
// 在这里处理接收到的数据
// 广播数据给其他连接
broadcast(data, sender);
}
}
void onDisconnected()
{
QTcpSocket *sender = qobject_cast<QTcpSocket*>(QObject::sender());
qDebug() << "Connection closed: " << sender->peerAddress().toString();
// 从连接列表中移除断开的连接
m_connections.removeOne(sender);
// 断开连接并释放资源
sender->deleteLater();
}
private:
QList<QTcpSocket*> m_connections;
void broadcast(const QByteArray &data, QTcpSocket *exclude)
{
for (QTcpSocket* socket : m_connections)
{
if (socket != exclude && socket->isValid())
socket->write(data);
}
}
};
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
MyServer server;
if (!server.isListening())
{
qCritical() << "Failed to start the server.";
return -1;
}
qDebug() << "Server started and listening on port" << server.serverPort();
return app.exec();
}
这个例子展示了如何创建一个多对多的TCP服务器。它监听所有网络接口上的任意可用端口,并且可以同时处理多个客户端的连接。每当有新的客户端连接时,会创建一个新的QTcpSocket对象,并将其加入到连接列表中。当有数据可读取时,服务器会将数据广播给其他所有已连接的客户端(除了发送者)。当一个客户端断开连接时,它会从连接列表中移除,并关闭套接字。
请注意,以上只是一个简单的示例,你可以根据自己的需求和业务逻辑进行扩展。希望对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问