开发过程中我们会遇到各色各样的问题,很多问题我们都会通过网络解决,近期小编在公司做一个项目需要与外部对接,他们提供socket-io的服务端 ,我们写客户端去连接。
本以为这是一个很简单的问题却被难了好一阵,接下来就把我的经历和最终实现方案写出来。免得大家被小难点拖住,浪费时间,且浪费经历。
废话少说,上代码!!!!
**
版本问题
**
这里要注意的是,官网对客户端 服务端版本有严格要求
依赖
<dependency>
<groupId>io.socket</groupId>
<artifactId>socket.io-client</artifactId>
<version>1.0.1 或者 2.0.0</version>
</dependency>
**
核心代码
**
public static void main(String[] args) {
try {
IO.Options options = new IO.Options();
options.path="你的path";
options.transports=new String[]{"websocket"};
//服务端的host
final Socket socket = IO.socket("http://127.0.0.1", options);
//连接成功事件
socket.on(Socket.EVENT_CONNECT, objects -> {
System.out.println("client: " + "连接成功"+Arrays.toString(objects));
//socket.emit("subscribe", getValueMap);
});
//心跳方法--具体看对方文档
socket.on("heartbeat", objects-> {
socket.emit("heartbeat", "!");
});
socket.on(Socket.EVENT_DISCONNECT, objects -> System.out.println("client: " + "断开连接"+Arrays.toString(objects)));
socket.on(Socket.EVENT_CONNECT_ERROR, objects -> System.out.println("client: " + "连接失败"+Arrays.toString(objects)));
//自定义监听事件 --接收服务端发送的数据-一般订阅场景使用
socket.on("GetValue", new Emitter.Listener() {
@Override
public void call(Object... objects) {
System.out.println("client: " + "接收数据"+Arrays.toString(objects));
}
});
socket.connect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
当时写demo的时候一开始并没有难住小编,但是人家请求头需要cookie,本来这也不是啥问题2.x版本提供了方法,构建IO.Options的时候添加了方法,如下
2.0版本添加额外的请求头
options.extraHeaders = singletonMap("Authorization", singletonList("Bearer abcd"));
还提供了新构建options的方法,这都属于添加额外的请求头
IO.Options options = IO.Options.builder()
.setExtraHeaders(singletonMap("Authorization", singletonList("Bearer abcd")))
.build();
//其他参数
IO.Options options = IO.Options.builder()
// IO factory options
.setForceNew(false)
.setMultiplex(true)
// low-level engine options
.setTransports(new String[] { Polling.NAME, WebSocket.NAME })
.setUpgrade(true)
.setRememberUpgrade(false)
.setPath("/socket.io/")
.setQuery(null)
.setExtraHeaders(null)
// Manager options
.setReconnection(true)
.setReconnectionAttempts(Integer.MAX_VALUE)
.setReconnectionDelay(1_000)
.setReconnectionDelayMax(5_000)
.setRandomizationFactor(0.5)
.setTimeout(20_000)
// Socket options
.setAuth(null)
.build();
1.x版本添加额外的请求头或响应头
只添加请求头代码
socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
@Override
public void call(Object... objects) {
Transport transport = (Transport) objects[0];
transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
@Override
public void call(Object... objects) {
Map<String, List<String>> headers = (Map<String, List<String>>) objects[0];
//自定义头
headers.put("Cookie",Arrays.asList(finalCookieString));
}
});
}
}
);
这样就完美的解决了1.x版本到2.x版本的依赖的请求以及加自定义请求头问题了。
希望我的文档能够帮到你,请点赞收藏哦!!
如果还有疑问???
参考网站:
官方文档:https://socketio.github.io/socket.io-client-java/