亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當服務器發送大量響應時,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 關注
  • 299 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號