我遇到了这个问题,很难在任何地方找到答案,所以我想我会在这里为未来的程序员输入它。
在Jetty 9中,如果您试图在会话对象上设置最大消息大小以处理大型数据包,那么它将不起作用。如果您的客户端尝试发送大量数据,您仍然会断开连接。我正在讨论此对象上的setMaximimumMessageSize:http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/api/Session.html
相反,您要做的是设置从WebSocketServlet工厂获取的策略对象的最大消息大小。
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());
}
}
这将按预期工作,您的服务器将能够处理您设置的最大大小的大型邮件。
在WebSocketServlet
中设置最大消息的方式是正确的。
您在javadoc中指出的Session.setMaximumMessageSize(long)是JSR-356(javax.websocketneneneba API)工作的早期草案的一个不幸泄漏。
API码头侧的方法不应存在,并且已在码头9.1 中删除
Bug已归档: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)
我在发送大于64KB的文件(二进制数据)时遇到了这个问题。我使用的是Embedded Jetty websocket Examples中的javax.websocket示例。最后,我唯一需要做的就是在@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) {
...
}
}
如果有人想要可配置的替代方案,在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>