QT开发中文网

qt实现多对多tcp服务器

要实现一个多对多的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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=6838

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?