使用场景:
通过qtservice创建后台服务,后台服务程序websocket服务端建立与前端之间的通信,后台服务程序websocket客户端建立与转写引擎直接的通信。
在后台服务websocket服务器端类中创建websocket客户端对象,当websocket客户端对象未创建线程时,websocket客户端会存在向转写引擎服务器发送音频数据以及心跳信息(定时器中发送),通信正常进行。考虑到采集音频发送比较耗时,将websocket客户端创建线程(movetothread),此时同时发送音频数据及心跳消息给转写引擎服务器失败,抓包显示无数据传输。客户端发送数据后,增加flush此时通信正常了。
{
m_pwebSocket->sendTextMessage("***");
m_pwebSocket->flush();
}
问题分析:注释掉定时器中心跳发送消息可向转写引擎服务器正常发送音频数据。怀疑线程中创建定时器中超时发送消息会阻塞websocket消息发送。线程中定时器默认不会进入事件循环机制。
bool flush()
此功能尽可能地从内部写入缓冲区写入底层网络套接字,而不会阻塞。 如果有任何数据被写入,则该函数返回true; 否则返回false。 如果您需要QWebSocket立即开始发送缓冲数据,请调用此函数。 成功写入的字节数取决于操作系统。 在大多数情况下,您不需要调用此函数,因为一旦控制回到事件循环,QWebSocket就会自动开始发送数据。