8

我是 Java 新手WebSocket。当我尝试传递JSON长度大于的 a 时8192,websocket 立即断开连接。无论如何JSON,长度都<= 8191很好。

是否有任何MAX SIZE/ LIMIT数据可以通过 a 传递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。

4

2 回答 2

12

IT 实际上是一个非常大的价值,您可能不必担心它。

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

尽量让它尽可能少地满足您的要求。

因为问题是在服务器端(tomcat)产生的。检查tomcat文档我看到:

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

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

有关其他信息,请参阅此处的 tomcat 指南

于 2015-08-31T11:05:15.690 回答
3

关于与 WebSocket 断开连接相关的问题,我在我的 Android 客户端中遇到了同样的问题,即接收到下一条消息“二进制消息大小超过最大大小”。

在所有 Jetty 文档和其余网页中寻找一些解决方案后,我得到的唯一可行选项是包含下一个代码“maxBinaryMessageSize = size * 1024”(从客户端的角度来看,大小是您需要的最大限制)在 WebSocket 类定义中,您可以在下一行中看到:

    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 中)确认这是否是正确的解决方案,那就太好了。谢谢。

于 2016-08-03T18:53:38.437 回答