此篇文章基于你已经懂得了简单的TCP一对一通信了
不懂的话可以去本篇博客QT TCP简单的通信示例 在此基础稍加修改即可多方通信.
由于有多个客户端,所以需要用一个QList来把所有的客户端给存起来.
int m_iClientCount;
QList<QTcpSocket*> listClient;//用来装每个客户端对应的socket的
//获得连接客户端的SOCKET套接字
m_tsTcpSocket = m_tsTcpServer->nextPendingConnection();
listClient.append(m_tsTcpSocket);//将生成的socket添加到容器里
m_iClientCount++;
然后有信号到来时触发读的槽函数后,直接遍历容器读取即可
QByteArray baArray;
//利用for循环循环列表中的每一个连接进来的客户端,判断是哪一个客户端发的数据
for(int i=0;i<listClient.size();i++)
{
m_tsTcpSocket = listClient.value(i);
baArray = m_tsTcpSocket->readAll();
if(baArray.length()!=0)//如果检测到接收到的数据长度不为0,则代表是这个客户端发送的数据
{
QString sMsg = baArray;
qDebug() << sMsg;
}
}
写数据的时候同理
2022/5/16补充:
姐妹们,上面那个一个服务端接收多个客户端的消息是没问题。but如果客户端发消息的时候,比如我一次for循环发多条的话,接收端那边显示的包数就和客户端那边对应不起来。
比如有两个客户端同时发消息,而每个客户端每次for循环发5次,那那么服务端那边只会显示收到2个包而不是10个!!
原因我也不知道(2022/5/23我觉得大概是这个原因注:write()函数和被触发的读的readyRead()信号并不是一一对应的,比如可能你客户端write了三次,服务端那边的readyRead可能才被触发一次.所以我们在读socket数据的时候要全部读完而不是等到readyRead被触发的时候才去读完全部的数据),下面这种方法可以解决:
版权声明:本文为ligare原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。