java socket-io client demo 添加自定义请求标头

本文档分享了在Java中使用Socket.IO客户端连接服务端时遇到的问题及解决方案,包括版本兼容性、添加请求头等关键步骤。详细介绍了1.x到2.x版本的迁移策略,并提供了核心代码示例,帮助开发者解决实际开发中的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发过程中我们会遇到各色各样的问题,很多问题我们都会通过网络解决,近期小编在公司做一个项目需要与外部对接,他们提供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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值