QT设计的多客户端一个服务器多线程SOCKET问题

zhouguoji1989 2014-07-10 01:02:04
一个客户端打开即创建一个socket线程,这个没问题。
一个客户端发送一个动作,消息发给服务器,服务器进行解析,操作数据库,返回给客户端结果,客户端收到结果显示。
当客户端消息发出的间隔长,在发送第二个消息之前第一个消息服务器已经成功解析,那不影响第二个消息。
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()), Qt::DirectConnection);
当连续发两个信息,服务器会错乱,


A消息发到服务器,服务器成功执行readMessage(),处理A消息
A消息发完立刻发B消息,这时候服务器没有执行B消息的readMessage(),而问我在发送C消息后,才执行的B消息的readMessage()。


请问这是为什么,该怎么写才能避免错乱。

void SocketThead::run()
{
qDebug()<<"222";
tcpSocket = new QTcpSocket;
if (!tcpSocket->setSocketDescriptor(socketDescriptor))
{
emit error(tcpSocket->error());
return;
}
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()), Qt::DirectConnection);
exec();
}
void SocketThead::readMessage()
{
QDataStream in(tcpSocket);
if (blockSize == 0)
{
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
{
return;
}
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
{
return;
}

in >> theString;
qDebug()<<"recieve--------------------------------------\n"<<theString;
blockSize = 0;
qDebug()<<"\nrecieve--------------------------------------\n";
sendMessage();
}
...全文
1741 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony2278 2016-08-24
  • 打赏
  • 举报
回复
引用 3 楼 luopeiyuan1990 的回复:
tcp都是流的形式在发,要从根本解决这个问题,设计下数据格式和解析条件就ok
不停地接收,累加到buffer,解析,移除buffer里面的内容,再接收,再累加到buffer,解析,移除buffer里面的内容,......
千荒 2016-08-24
  • 打赏
  • 举报
回复
楼上的方法靠谱。楼主的问题原因应该就是执行的时候客户端发送数据导致了不明问题,与正常的情况比,那前提就是执行时间过长。楼上的方法意思是将接收和执行分离开,接收不影响执行,可以同时进行。
wchpjx 2016-08-14
  • 打赏
  • 举报
回复
我也遇到过类似问题,收到顺序和发送顺序发生错了,没有看到你的源代码,我只能估计是你每次发送一个消息时就创建一个socket并连接,因为连接成功是异步的,成功发送更是异步的。因此接收顺序是没有保障的,可以采用发送一个,sleep一下再发下一个。sleep的时间一般可以定到20到100ms就可。我用10ms就可以了。
zhouguoji1989 2014-07-11
  • 打赏
  • 举报
回复
引用 5 楼 luopeiyuan1990 的回复:
线程互斥做好,最简单的做法,全局标志
晕死 你好像没明白我的意思。。
放牛娃不吃草 2014-07-11
  • 打赏
  • 举报
回复
说详细点,看看
放牛娃不吃草 2014-07-10
  • 打赏
  • 举报
回复
线程互斥做好,最简单的做法,全局标志
zhouguoji1989 2014-07-10
  • 打赏
  • 举报
回复
引用 3 楼 luopeiyuan1990 的回复:
tcp都是流的形式在发,要从根本解决这个问题,设计下数据格式和解析条件就ok
我都设计了标识了,不是这个意思,是我的一个线程下同时发2个消息,后到服务器的消息不执行槽函数,而再发第三个消息,第二个消息才会触发槽函数
放牛娃不吃草 2014-07-10
  • 打赏
  • 举报
回复
tcp都是流的形式在发,要从根本解决这个问题,设计下数据格式和解析条件就ok
zhouguoji1989 2014-07-10
  • 打赏
  • 举报
回复
引用 1 楼 Esonpo 的回复:
你的服务器也是Qt写的? 这里github上面有Qt client https://github.com/toby20130333/nodeChatClient.git And Nodejs server https://github.com/toby20130333/nodeChatServer.git
我就是想知道为什么会出现这个问题,就是readredy的槽函数,不能异步执行。
寒山-居士 2014-07-10
  • 打赏
  • 举报
回复
你的服务器也是Qt写的? 这里github上面有Qt client https://github.com/toby20130333/nodeChatClient.git And Nodejs server https://github.com/toby20130333/nodeChatServer.git

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧