You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Jetty WebSocket客户端设置缓冲区仍报消息过大如何解决

根本原因

你当前的配置顺序错误:WebSocketClient的所有参数配置必须在调用client.start()方法之前完成。start()执行时会初始化内部的WebSocketPolicy规则,默认二进制消息最大大小为65536,启动后再修改客户端的参数不会生效,因此你设置的700000实际没有被加载。

正确修改方案

1. 调整配置顺序,优先设置参数再启动客户端

同时建议直接修改WebSocketPolicy的两个关联参数,避免遗漏:

  • maxBinaryMessageSize:允许接收的二进制消息最大大小
  • maxBinaryMessageBufferSize:二进制消息接收缓冲区大小
    两者建议设置为相同值,避免出现大小不匹配问题。

修改后的连接代码如下:

public void connectWebSocket(String vaHost, String apiKey) throws Exception{
    logger.info("========= CONNECT WEBSOCKET ==========");
    String destUri = "ws://"+vaHost+"/metadata";

    WebSocketClient client = new WebSocketClient();
    SimpleEchoSocket socket = new SimpleEchoSocket();

    // 所有客户端配置必须放在start()之前执行
    client.setConnectTimeout(-1);
    // 获取Policy直接修改,配置更全面
    WebSocketPolicy policy = client.getPolicy();
    policy.setMaxBinaryMessageSize(700000);
    policy.setMaxBinaryMessageBufferSize(700000);

    // 配置完所有参数再启动客户端
    client.start();

    URI echoUri = new URI(destUri);
    ClientUpgradeRequest requestws = new ClientUpgradeRequest();
    requestws.setSubProtocols("va-metadata");
    requestws.setTimeout(-1, TimeUnit.SECONDS);

    client.connect(socket,echoUri,requestws);
    logger.info("=========WS Connecting to :"+echoUri);
}

2. 补充消息注解的大小配置

如果你的SimpleEchoSocket类使用@OnMessage注解接收消息,需要在注解中指定最大二进制消息大小,注解配置的优先级高于全局客户端配置:

@OnMessage(maxBinaryMessageSize = 700000)
public void onBinaryMessage(byte[] payload, Session session) {
    // 你的业务处理逻辑
}
补充说明

如果修改完客户端配置后仍出现该异常,可检查对应WebSocket服务端的消息大小限制,部分Jetty服务端默认也会开启64K的消息大小限制,需要同步调整服务端的WebSocketPolicy配置。

内容的提问来源于stack exchange,提问作者Julia5049

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:36:04