为了账号安全,请及时绑定邮箱和手机立即绑定

当服务器发送大量响应时,WebSocket 客户端未收到 onmessage 事件

当服务器发送大量响应时,WebSocket 客户端未收到 onmessage 事件

慕标琳琳 2023-06-29 15:34:40
我正在创建基于 TcpClient 和 NetworkStream 与 Javascript 客户端通信的 .net websocket 服务器。握手后,客户端要求服务器执行特定操作,服务器生成响应 - 到目前为止,它只是发送回客户端的短 JSON 字符串 - 并且工作正常。当我需要发送更大的字符串响应(即具有 200k 和更多字节的 Base64 编码图像)后,客户端停止接收响应,并且没有触发 onmessage 事件。如果我切换并发送短 json - 它会再次正常工作。当我发送大数据时:当我发送简单数据时:客户端我从所有不相关的内容中剥离了代码(行为保持不变)try{    ws = new WebSocket("ws://127.0.0.1:8282");    ws.binaryType = "arraybuffer";}catch(err){    debugger;    document.getElementById("message").innerHTML = "Not Connected! " + err;         };ws.onopen = function () {    var jsonRequest = '{"action" : "START_STREAM","timeout"  : 20}';    ws.send("START_STREAM");};在服务器端,我在生成响应后隔离了代码(带有 base64 编码图像的纯字符串,我对其进行了测试并正确解码): Byte[] frame = CreateFrameFromString(serverResponse); networkStream.Write(frame, 0, frame.Count()); networkStream.Flush(); clientSocket.Close(); clientSocket = ServerListener.AcceptTcpClient(); networkStream = clientSocket.GetStream();初始化服务器线程的代码: ServerListener.Start(); clientSocket = ServerListener.AcceptTcpClient(); NetworkStream networkStream = clientSocket.GetStream(); while (true)    {     if (!networkStream.DataAvailable)  ...regular loop/server stuff/handshake etc.方法 CreateFrameFromString 如下。操作码使用 0-10 的值进行测试,在所有情况下行为都是相同的 - 客户端没有捕获任何响应。我是否遗漏了一些东西 - 协议/缓冲区大小/等等?在测试时,我注意到使用上述设置可以发送最多 4250 个字符的响应,无需任何修改。一旦我达到这个数字,反应就开始消失。
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

经过大量故障排除后,事实证明我必须以包的形式发送数据,而不是作为一个整体发送数据。我将响应分割成块(50000 个字符),然后将它们一一发送,而在客户端,我在 onmessage 事件中拾取这些片段。发送所有响应块后,我关闭了会话 - 这在客户端触发了从 Base64 流创建图像。



查看完整回答
反对 回复 2023-06-29
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信