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
相关产品推荐
相关产品推荐

