QWebSocket发送消息异常

在使用Qt服务创建的后台程序中,通过WebSocket与前端及转写引擎进行通信。当WebSocket客户端放入线程并启用定时器发送心跳时,出现通信故障。问题在于线程中的定时器可能阻塞了数据发送。通过调用flush函数强制清空内部缓冲区,解决了发送音频数据和心跳信息的同步问题,确保了与转写引擎的正常通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用场景:

       通过qtservice创建后台服务,后台服务程序websocket服务端建立与前端之间的通信,后台服务程序websocket客户端建立与转写引擎直接的通信。

        在后台服务websocket服务器端类中创建websocket客户端对象,当websocket客户端对象未创建线程时,websocket客户端会存在向转写引擎服务器发送音频数据以及心跳信息(定时器中发送),通信正常进行。考虑到采集音频发送比较耗时,将websocket客户端创建线程(movetothread),此时同时发送音频数据及心跳消息给转写引擎服务器失败,抓包显示无数据传输。客户端发送数据后,增加flush此时通信正常了。

{

        m_pwebSocket->sendTextMessage("***");

        m_pwebSocket->flush();

}

问题分析:注释掉定时器中心跳发送消息可向转写引擎服务器正常发送音频数据。怀疑线程中创建定时器中超时发送消息会阻塞websocket消息发送。线程中定时器默认不会进入事件循环机制。

bool flush()

此功能尽可能地从内部写入缓冲区写入底层网络套接字,而不会阻塞。 如果有任何数据被写入,则该函数返回true; 否则返回false。 如果您需要QWebSocket立即开始发送缓冲数据,请调用此函数。 成功写入的字节数取决于操作系统。 在大多数情况下,您不需要调用此函数,因为一旦控制回到事件循环,QWebSocket就会自动开始发送数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值