我正在創(chuàng)建基于 TcpClient 和 NetworkStream 與 Javascript 客戶端通信的 .net websocket 服務(wù)器。握手后,客戶端要求服務(wù)器執(zhí)行特定操作,服務(wù)器生成響應(yīng) - 到目前為止,它只是發(fā)送回客戶端的短 JSON 字符串 - 并且工作正常。當(dāng)我需要發(fā)送更大的字符串響應(yīng)(即具有 200k 和更多字節(jié)的 Base64 編碼圖像)后,客戶端停止接收響應(yīng),并且沒有觸發(fā) onmessage 事件。如果我切換并發(fā)送短 json - 它會再次正常工作。當(dāng)我發(fā)送大數(shù)據(jù)時:當(dāng)我發(fā)送簡單數(shù)據(jù)時:客戶端我從所有不相關(guān)的內(nèi)容中剝離了代碼(行為保持不變)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");};在服務(wù)器端,我在生成響應(yīng)后隔離了代碼(帶有 base64 編碼圖像的純字符串,我對其進行了測試并正確解碼): Byte[] frame = CreateFrameFromString(serverResponse); networkStream.Write(frame, 0, frame.Count()); networkStream.Flush(); clientSocket.Close(); clientSocket = ServerListener.AcceptTcpClient(); networkStream = clientSocket.GetStream();初始化服務(wù)器線程的代碼: ServerListener.Start(); clientSocket = ServerListener.AcceptTcpClient(); NetworkStream networkStream = clientSocket.GetStream(); while (true) { if (!networkStream.DataAvailable) ...regular loop/server stuff/handshake etc.方法 CreateFrameFromString 如下。操作碼使用 0-10 的值進行測試,在所有情況下行為都是相同的 - 客戶端沒有捕獲任何響應(yīng)。我是否遺漏了一些東西 - 協(xié)議/緩沖區(qū)大小/等等?在測試時,我注意到使用上述設(shè)置可以發(fā)送最多 4250 個字符的響應(yīng),無需任何修改。一旦我達到這個數(shù)字,反應(yīng)就開始消失。
當(dāng)服務(wù)器發(fā)送大量響應(yīng)時,WebSocket 客戶端未收到 onmessage 事件
慕標(biāo)琳琳
2023-06-29 15:34:40