websocket客户端在发送大数据时断开连接

Posted

技术标签:

【中文标题】websocket客户端在发送大数据时断开连接【英文标题】:websocket client disconnects on sending large data 【发布时间】:2015-05-30 22:01:03 【问题描述】:

我有 nodejs websocket 服务器和客户端来发送图像。问题是客户端在发送高分辨率 [即 512 x 512 或更高] 或大尺寸 [即接近 > 50KB] 图像时自动断开连接。

注意:尺寸和尺寸较小的它可以发送。

function getBase64Image(img) 
  var canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;

  var ctx = canvas.getContext("2d");
  ctx.drawImage(img, 0, 0);

  var dataURL = canvas.toDataURL("image/png");
  return dataURL;
 

function sendImage()
  var img = getBase64Image(document.getElementById("image") );
  var JSONimg = 
   ' type' : 'img',
   'data' : img,
  
 ws.send(JSON.stringify(JSONimg));
 

对应的HTML:

 <button onclick="sendImage()">Send Image</button>
 <img id="image" src="img/image.png"  />

问题

图像的大小或尺寸是套接字断开的原因吗?

websocket 消息有大小限制吗?

【问题讨论】:

【参考方案1】:

我找到了解决方案。这里的问题在于数据大小。 Web 套接字协议对消息大小有其限制。在实施之前最好遵循 RFC 标准。这里解释rfc6455#section-5.2

【讨论】:

什么是数据限制?例如 Json。【参考方案2】:

如this Q&A 中所述,WebSocket 消息在协议级别没有大小限制。然而,由于内存问题,大多数实现对消息大小都有自己的限制。所以你应该看看你使用的 WebSocket 实现的文档。

顺便说一句,WebSocket 协议允许直接交换二进制消息,而无需进行二进制到文本的转换,这会降低性能并增加消息大小。

【讨论】:

以上是关于websocket客户端在发送大数据时断开连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在WebSocket的服务器侧检测客户端的断开连接

Websocket PHP:从客户端发送到服务器的立即断开连接和奇怪的消息字符串

Javascript Websockets在页面卸载时断开连接

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户

在播放框架中发送大文件时如何捕获客户端断开连接?

HAProxy + WebSocket 断开连接