【问题标题】:Jetty 9 WebSocket Server Max Message Size on SessionJetty 9 WebSocket 服务器会话上的最大消息大小
【发布时间】:2013-07-05 21:38:11
【问题描述】:

我遇到了这个问题,并且在任何地方都很难找到答案,所以我想我会在这里为未来的程序员输入它。

在 Jetty 9 中,如果您尝试在会话对象上设置最大消息大小以处理大数据包,它将不起作用。如果您的客户端尝试发送大数据,您仍然会断开连接。我说的是这个对象上的 setMaximimumMessageSize:http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/api/Session.html

相反,您需要在从 WebSocketServletFactory 获取的策略对象上设置最大消息大小。

public final class MyWebSocketServlet extends WebSocketServlet
{
    private static final long MAX_MESSAGE_SIZE = 1000000;

    @Override
    public void configure(WebSocketServletFactory factory)
    {
        factory.getPolicy().setMaxMessageSize(MAX_MESSAGE_SIZE);
        factory.setCreator(new MyWebSocketCreator());
    }
}

这将按预期工作,并且您的服务器将能够处理最多为您设置的最大大小的大型消息。

【问题讨论】:

    标签: websocket size jetty message


    【解决方案1】:

    WebSocketServlet 中设置最大消息的方式是正确的。

    您在 javadoc 中指出的 Session.setMaximumMessageSize(long) 不幸泄露了 JSR-356 (javax.websocket API) 工作的早期草案。

    Jetty 端 API 上的该方法不应该存在,并且已在 Jetty 9.1 中删除

    Bug 已提交:https://bugs.eclipse.org/bugs/show_bug.cgi?id=412439

    注意:Jetty 9.1 将支持 JSR-356 (javax.websocket API)。其中 javax.websocket.Session 有 2 个类似行为的方法。

    • javax.websocket.Session.setMaxBinaryMessageBufferSize(int)
    • javax.websocket.Session.setMaxTextMessageBufferSize(int)

    【讨论】:

      【解决方案2】:

      我在发送超过 64KB 的文件(二进制数据)时遇到了这个问题。我使用的是javax.websocket-example from the Embedded Jetty WebSocket Examples。 最后,我唯一需要做的就是在 @OnOpen 注释方法的 Session 参数中添加 setMaxBinaryMessageBufferSize

      @ClientEndpoint
      @ServerEndpoint(value = "/ws")
      public class EventSocket {
      
          @OnOpen
          public void onWebSocketConnect(Session sess) {
              sess.setMaxBinaryMessageBufferSize(1 * 1024 * 1024); // 1MB
          }
      
           @OnMessage
          public void processUpload(byte[] b, boolean last, Session session) {
                  ...
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        如果有人想要可配置的替代方案,在 web.xml 中设置 servlet 参数 maxTextMessageSize 也可以 -

        <servlet>
            <servlet-name>MyWebSocketServlet</servlet-name>
            <servlet-class>test.MyWebSocketServlet</servlet-class>
            <init-param>
                <param-name>maxTextMessageSize</param-name>
                <param-value>1048576</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>MyWebSocketServlet</servlet-name>
            <url-pattern>/MyWebSocket/*</url-pattern>
        </servlet-mapping>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-10
          • 1970-01-01
          • 1970-01-01
          • 2015-04-02
          • 2014-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多