WebSocket 可以传递的数据最大大小是多少?

9
我是新手,对于Websockets不太熟悉。当我尝试传递长度大于8192的JSON时,WebSocket会立即断开连接。然而,长度小于等于8191的JSON可以正常工作。
是否有数据的最大大小/限制可以通过WebSocket传递?如果有,那么这个大小是多少?

我通过在我的web.xml中添加以下行来修复错误

<context-param>
         <param-name>org.apache.tomcat.websocket.textBufferSize</param-name>
         <param-value>32768</param-value>
    </context-param>
    <context-param>
            <param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name>
            <param-value>32768</param-value>
</context-param>

感谢 @Davide Lorenzo MARINO。
2个回答

14

IT (信息技术)实际上是一个非常重要的价值,你可能不必担心它。

根据RFC-6455基础帧格式,单个帧的最大大小限制为18,446,744,073,709,551,615字节(64位无符号值的最大值)。

尽可能减小它以处理您的需求。

由于问题是在服务器端(tomcat)生成的。查看tomcat文档,我发现:

二进制消息的默认缓冲区大小为8192字节。可以通过将servlet上下文初始化参数org.apache.tomcat.websocket.binaryBufferSize设置为所需的字节数来更改此大小。

因此,您可以通过更新tomcat配置文件中的org.apache.tomcat.websocket.binaryBufferSize参数来更改它。

有关详细信息,请参见tomcat指南here


服务器是否可能不接受超过8191字节的请求?也有可能问题出在JSON解析器上。 - Davide Lorenzo MARINO
我正在使用Tomcat 7,我可以保证问题不在JSON解析上。可能是Tomcat的问题。 - theapache64
在你说服务器是Tomcat服务器之后,我编辑了我的答案。 - Davide Lorenzo MARINO
好的,我明白了。所以它是8192字节。 - theapache64
如果你发现这个答案有用,你可以点赞并标记它为正确的回复。谢谢你的努力工作。 - Davide Lorenzo MARINO
显示剩余2条评论

3
关于WebSocket断开连接的问题,我在我的Android客户端中遇到了相同的问题,接收到了“二进制消息大小超过最大限制”的下一条消息。
在查阅Jetty文档和其他网页的解决方案后,我唯一有效的选择是在WebSocket类定义中包含以下代码:“maxBinaryMessageSize = size * 1024”(其中size是客户端所需的最大限制),请参见下面的代码:
    import org.eclipse.jetty.websocket.api.BatchMode;
    import org.eclipse.jetty.websocket.api.RemoteEndpoint;
    import org.eclipse.jetty.websocket.api.Session;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
    import org.eclipse.jetty.websocket.api.annotations.WebSocket;

    @WebSocket(maxBinaryMessageSize = 1024 * 1024)
    public class MyClientWebSocket
    {

      @OnWebSocketClose
      public void onClose(int statusCode, String reason)
      {
        closeLatch.countDown();
      }

      @OnWebSocketError
      public void onError(Throwable reason)
      {
        //TODO ACORDARSE DE QUITAR ESTO
        Log.w(TAG, "+++ ERROR : " + reason);
      }

      @OnWebSocketConnect
      public void onConnect(Session session)
      {
        // your code
      }

      @OnWebSocketMessage
      public void onMessageBinary(byte[] message, int offset, int length)
      {
       // message can be processed with a maximum of 1024 * 1024 bytes and not anymore limited to 64 * 1024

      }
    }

如果有 WebSocket 专家能够确认这是否是客户端(Java/Android)的正确解决方案,那将非常棒。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接