Java实现Socket.IO v2聊天测试:连接与消息发送问题求助
Java实现Socket.IO v2聊天测试用例的问题修正
背景信息
正在使用Postman测试基于Socket.IO v2的聊天功能,需要用Java实现对应的聊天测试用例,Postman请求信息如下:
- Socket服务器地址:
https://hc-socketio-example.xyz - 请求头:
authorization: xxxsource: app
- 发送的JSON消息格式:
{ "ticketId": "63bcc910c22293b4b0495fe4", "content": "test ", "type": "text" }
用户现有Java代码:
URI uri = URI.create("https://hc-socket.unibag.xyz"); // @formatter:off IO.Options options = IO.Options.builder().build(); // @formatter:on Socket socket = IO.socket(uri, options); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("Connected to server..."); } }); socket.connect();
遇到的问题:
- 未打印"Connected to server...",疑似连接失败
- 不知道如何设置
authorization和source请求头 - 不确定如何发送指定格式的JSON消息
修正后的完整代码
import io.socket.client.IO; import io.socket.client.Socket; import io.socket.emitter.Emitter; import org.json.JSONObject; import java.net.URI; import java.util.HashMap; import java.util.Map; public class SocketIOChatTest { public static void main(String[] args) { try { // 统一服务器地址,与Postman配置保持一致 URI uri = URI.create("https://hc-socketio-example.xyz"); // 构建自定义请求头 Map<String, String> headers = new HashMap<>(); headers.put("authorization", "xxx"); headers.put("source", "app"); // 配置Socket.IO v2兼容选项 IO.Options options = IO.Options.builder() .setExtraHeaders(headers) .setForceNew(true) .setReconnection(false) // 指定v2版本兼容的传输方式 .setTransports(new String[]{"websocket", "polling"}) .build(); Socket socket = IO.socket(uri, options); // 监听连接成功事件 socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("Connected to server..."); // 构建并发送指定格式的JSON消息 JSONObject message = new JSONObject(); message.put("ticketId", "63bcc910c22293b4b0495fe4"); message.put("content", "test "); message.put("type", "text"); // 替换为服务器实际接收消息的事件名(例如"send_message") socket.emit("send_message", message); System.out.println("Message sent: " + message.toString()); } }); // 监听连接错误,排查问题 socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("Connect error: " + args[0]); } }); // 监听断开连接事件 socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("Disconnected from server..."); } }); socket.connect(); } catch (Exception e) { e.printStackTrace(); } } }
问题解决说明
1. 连接失败问题
- 统一服务器地址:原代码中服务器地址与Postman配置不一致,这是连接失败的核心原因之一,先修正为一致地址。
- 添加错误监听:通过
EVENT_CONNECT_ERROR可以直接打印连接错误信息,快速定位问题(如地址错误、版本不兼容、权限问题)。 - 指定v2兼容传输方式:Socket.IO v2默认传输方式可能与服务器不匹配,显式设置
websocket和polling保证兼容性。 - 配置连接参数:
setForceNew(true)避免复用旧连接,setReconnection(false)关闭自动重连,方便单次测试排查。
2. 设置请求头
通过IO.Options.builder().setExtraHeaders(headers)传入自定义请求头,其中headers为Map<String, String>类型,直接放入authorization和source的键值对即可。
3. 发送指定JSON消息
- 使用
org.json.JSONObject构建符合格式的消息对象(需引入依赖,如Maven的org.json:json:20230618)。 - 在
EVENT_CONNECT回调中调用socket.emit(事件名, 消息对象)发送消息,注意替换事件名为服务器实际接收的事件名(可通过Postman抓包或接口文档确认)。
内容的提问来源于stack exchange,提问作者SL Thang
相关产品推荐
相关产品推荐

