使用网址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。