QT TCP编程之多客户端区分

使用网址https://blog.csdn.net/u014252478/article/details/80377103在进行QT TCP网络编程时,在服务器端当收到客户端发来的数据时,无法知道是哪一个客户端发来的,网址中采用list中轮询进行查找,代码如下:

// 客户端数据可读信号,对应的读数据槽函数
void MyTcpServer::ReadData()
{
    // 由于readyRead信号并未提供SocketDecriptor,所以需要遍历所有客户端
    for(int i=0; i<tcpClient.length(); i++)
    {
        QByteArray buffer = tcpClient[i]->readAll();
        if(buffer.isEmpty())    continue;

        static QString IP_Port, IP_Port_Pre;
        IP_Port = tr("[%1:%2]:").arg(tcpClient[i]->peerAddress().toString().split("::ffff:")[1])\
                                     .arg(tcpClient[i]->peerPort());

        // 若此次消息的地址与上次不同,则需显示此次消息的客户端地址
        if(IP_Port != IP_Port_Pre)
            ui->edtRecv->append(IP_Port);

        ui->edtRecv->append(buffer);

        //更新ip_port
        IP_Port_Pre = IP_Port;
    }
}

此方法可以区分是哪一个客户端发过来的数据,但是不太友好。

网址https://stackoverflow.com/questions/36265902/c-multi-client-tcp-server-with-qlist中采用sender进行区分,可实现客户端数据的接收,不用采用轮询方法,代码修改如下:

// 客户端数据可读信号,对应的读数据槽函数
void MyTcpServer::ReadData()
{
    QByteArray buffer;
    QString ip_port;
    static QString lst_ip_port = "";
    QTcpSocket *readSocket = qobject_cast<QTcpSocket *>(sender());
    ip_port = tr("[%1:%2]").arg(readSocket->peerAddress().toString().split("::ffff:")[1]).arg(readSocket->peerPort());
    if(lst_ip_port != ip_port)
    {
        ui->edtRecv->append(ip_port);
        lst_ip_port = ip_port;
    }
    buffer = readSocket->readAll();
    ui->edtRecv->append(buffer);

    // qDebug() << "peerAddress" << readSocket->peerAddress().toString().split("::ffff:")[1];
}

关于qobject_cast可参考网址:https://www.cnblogs.com/findumars/p/5805096.html

上述网址https://stackoverflow.com/questions/36265902/c-multi-client-tcp-server-with-qlist中同样说了另外一种方法,QSignalMapper,关于QSignalMapper可参看https://www.cnblogs.com/findumars/p/8035496.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值