7

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

在 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());
    }
}

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

4

3 回答 3

7

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

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

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

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

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

  • javax.websocket.Session.setMaxBinaryMessageBufferSize(int)
  • javax.websocket.Session.setMaxTextMessageBufferSize(int)
于 2013-07-05T22:52:52.770 回答
1

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

@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) {
            ...
    }

}
于 2016-11-18T19:51:02.837 回答
0

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

<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>
于 2017-10-12T15:54:18.550 回答