Android中org.java_websocket.client.WebSocketClient无法接收大尺寸消息
调整Java-WebSocket客户端的最大消息长度限制
当然可以调整啦!你遇到的问题正是Java-WebSocket库默认消息大小限制导致的——超过阈值的消息会被拦截或者截断,所以没法正常接收。下面给你两种可行的调整方案,按需选择就行:
方案1:针对单个连接自定义Draft(推荐)
因为你当前使用的是Draft_6455协议,我们可以在实例化这个Draft对象时,直接指定最大消息大小和最大帧大小,精准控制当前连接的限制。
修改你的代码如下:
// 根据业务需求设置最大消息大小,这里示例设为10MB(单位:字节) int maxMessageSize = 10 * 1024 * 1024; // 自定义Draft,指定最大消息和帧大小 Draft_6455 customDraft = new Draft_6455( Draft_6455.DEFAULT_ACCEPT_PROTOCOLS, null, maxMessageSize, maxMessageSize ); // 使用自定义Draft创建WebSocketClient WebSocketClient mWebsocketClient = new WebSocketClient(serverUri, customDraft, mHeaders, Constants.WEBSOCKET_CONFIG.CONNECTION_TIMEOUT) { @Override public void onOpen(ServerHandshake handshakeData) { Log.d(TAG, "Opened"); } // 现在大消息应该能正常接收了 @Override public void onMessage(String message) { Log.i(TAG, message); } @Override public void onClose(int code, String reason, boolean remote) { Log.i(TAG, String.format("Closed. Code: %s, Reason: %s, Remote: %s", code, reason, remote)); } @Override public void onError(Exception ex) { Log.i(TAG, "Error " + ex.getMessage()); } };
这里的参数说明:
- 第三个参数是最大消息总大小(字节)
- 第四个参数是单帧最大大小(字节)
一般把两者设为相同值即可,你可以根据实际需要接收的消息大小调整这个数值。
方案2:全局设置所有连接的限制
如果你的应用中所有WebSocket连接都需要放宽消息大小限制,可以在创建任何WebSocketClient实例之前,设置全局默认值:
// 全局设置最大消息和帧大小为10MB WebSocket.setDefaultMaxFrameSize(10 * 1024 * 1024); WebSocket.setDefaultMaxMessageSize(10 * 1024 * 1024);
注意事项
- 调整大小后,要确保服务器端也配置了对应的最大消息大小限制,不然可能出现客户端允许但服务器拒绝的情况,导致连接异常。
- 不要盲目设置过大的值,要根据业务场景合理调整,避免因接收超大消息导致内存溢出问题。
内容的提问来源于stack exchange,提问作者hendrikdelarey
相关产品推荐
相关产品推荐

