2013-07-05 106 views
5

我遇到了這個問題,並且在這個任何地方找到答案都有些困難,所以我想我會在這裏爲未來的程序員輸入它。Jetty 9 WebSocket服務器會話上的最大郵件大小

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

這將按預期工作,您的服務器將能夠處理大型郵件,達到您設置的最大尺寸。

回答

6

您設置最大消息的方式在WebSocketServlet中是正確的。

正如您在javadoc中指出的那樣,Session.setMaximumMessageSize(long)不幸遺漏了JSR-356(javax.websocket API)的早期草案工作。

這在碼頭邊API方法不應該存在,並在碼頭已被刪除9.1

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

注:碼頭9.1將有JSR-356(使用javax。 websocket API)支持。其中javax.websocket.Session有2個類似行爲的方法。

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

我發送帶有超過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) { 
      ... 
    } 

} 
0

如果有人想配置可供選擇,設定的servlet參數在web.xml中也適用 -

<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> 
相關問題