- 主题:请教socket编程如何保证响应的时效性
用qt的socket,不知道是qt函数库的问题呢,还是什么问题,通信的时效性无法保证。但听过侦听网络数据包发现从对方读取数据,对方的响应很快,基本在5ms以内就有答复,但是我的应用程序却无法保证在100ms内获取到对方的应答,有的时候可以,有的时候不行。此外,debug版本和release版本的表现也不一样,qt4和qt5编译出来的程序的表现也不一样。感觉进入了一个大坑!
--
FROM 113.70.65.*
我是用来做工业应用程序的,对时效性要求高。代码的问题应该是有,我发现两次通信之间人为的加入200ms(用的是processEvents)的延时,通信的可靠性就好了,基本不会有几秒钟,甚至十几秒都读不到数据的情况(qt4可以,qt5编译的程序也有问题)。
PS:我的通信代码是放在另一个线程里面的,也同样放了延时,但是延时的时间却不能长,长了也会有十几秒读不到数据的情况。
【 在 hgoldfish 的大作中提到: 】
: 估计是代码的问题。
: 正常不会碰到这样的问题。
: 我甚至拿 Qt 写一些服务器后端的网络服务程序。已经在生产服务器上运行好几年了。
: ...................
--
修改:hengcuiyuan FROM 113.70.65.*
FROM 113.70.65.*
qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
【 在 hgoldfish 的大作中提到: 】
: 别用 Qt 搞网络了。Qt 的网络模块很难用。
: 但是就算 Qt 的再难用,200ms 的延迟这肯定是你代码写错了。
: 在没有源代码的情况下无法判断问题出在哪里。建议你仔细看一下 Qt 的文档和别人的项目是怎么写的。
: ...................
--
FROM 113.70.91.*
看来都是踩过坑的,哈哈。你用的是qt的哪个版本,finished的是什么意思,信号还是函数? 我看qt5现在给的异步通信的例子,是用QDataStream里面的事务来接收数据的,说数据包没有到齐的时候可以回退,然后等待新的readyRead信号,我采用他的示范方案来试试看。
【 在 missdeer 的大作中提到: 】
: 还有个大坑,有时候不会有readyRead信号,只能在finished的时候readAll一次读完,不知道什么原因
--
FROM 113.70.91.*
用while我也想过,这就要设置超时,我看手册上又说响应readyRead信号的槽函数里面不能用processEvent,这个超时又该如何设置呢?我又怎么知道什么时候所有信息读完了呢?
【 在 hgoldfish 的大作中提到: 】
: 这时候你要写 while() 循环把所有信息都读完。
:
--
修改:hengcuiyuan FROM 113.70.91.*
FROM 113.70.91.*
噢,您已经用了最新的qt了,我还在用qt5.15
【 在 missdeer 的大作中提到: 】
: 最新的6.3.0
: QNetworkReply::finished 信号
--
FROM 45.78.57.*
这是阻塞模式吧,我想用非阻塞模式。
【 在 dormouseBHU 的大作中提到: 】
: 还有一个问题。既然读取网络数据不在主线程中,就不应该用readyRead,而是应该用 waitForReadyRead。
: Qt 文档写的很清楚:
: This function can operate without an event loop. It is useful when writing non-GUI applications and when performing I/O operations in a non-GUI thread.
: ...................
--
FROM 45.78.57.*
没有复杂操作,只是接受个数据而已,现在的问题是数据都接受不全。
【 在 clyu1981 的大作中提到: 】
: 你都多线程了,应该复杂操作扔给线程去干,而不是在槽函数里干复杂操作浪费计算资源。
--
FROM 45.78.57.*
多线程的时候就是会这么碰巧的, 我不做多线程就很稳健。多线程的时候,就是会有在执行readyRead信号的槽函数的时候,有数据到来,然后并不会发出readyRead信号,时不时出现这种情况。
【 在 clyu1981 的大作中提到: 】
: 感觉不太可能啊?
: 其它事件函数也没有耗费时间比较长的?
--
FROM 45.78.57.*
弃用之后呢,改用什么来做通信了?
【 在 polarx 的大作中提到: 】
: 之前也遇到过这种情况,应该是qt的底层问题,后来我就抛弃了它。
--
FROM 113.70.91.*