我正在創建基于 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 個字符的響應,無需任何修改。一旦我達到這個數字,反應就開始消失。
當服務器發送大量響應時,WebSocket 客戶端未收到 onmessage 事件
慕標琳琳
2023-06-29 15:34:40