Jetty 9 WebSocket服务器会话最大消息大小

时间:2013-07-05 21:38:11

标签: websocket size jetty message

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

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

这将按预期工作,您的服务器将能够处理最大尺寸的大型邮件。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

发送超过64KB的文件(二进制数据)时遇到此问题。我正在使用javax.websocket-example from the Embedded Jetty WebSocket Examples。 最后,我唯一需要做的就是在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) {
            ...
    }

}

答案 2 :(得分:0)

如果有人想要可配置的替代方案,在web.xml中设置servlet参数renderer = hv.renderer('bokeh').instance(mode='server') plot = hv.Curve( data , kdims=['observation_time'] , vdims=vdims , extents=(pd.datetime(year=2000, month=1, day=1, hour=0, minute=0, second=0), None, pd.datetime(year=2000, month=1, day=1+days, hour=0, minute=0, second=0), None) , label=vdims_str + " " )(plot=dict(width=WIDTH)) ... plot1 = _get_curve(date_index=date_index, vdims_str='total_a') plot2 = _get_curve(date_index=date_index, vdims_str='total_b') plot3 = _get_curve(date_index=date_index, vdims_str='total_c') plots = plot1 * plot2 * plot3 也有效 -

public class CircleImage : Image
{

    public static readonly BindableProperty CurvedBackgroundColorProperty =
        BindableProperty.Create(
            nameof(CurvedBackgroundColor),
            typeof(Color),
            typeof(CurvedCornersLabel),
            Color.Default);

    public Color CurvedBackgroundColor
    {
        get { return (Color)GetValue(CurvedBackgroundColorProperty); }
        set { SetValue(CurvedBackgroundColorProperty, value); }
    }

}

//Android/iOS

[assembly: ExportRenderer(typeof(CircleImage), typeof(CircleImageRenderer))]
namespace SchedulingTool.iOS.Renderers
{
    public class CircleImageRenderer : ImageRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                var xfViewReference = (CircleImage)Element;
                //Here you can reference xfViewReference.CurvedBackgroundColor to assign what ever is binded.
            }
        }
    }
}