【问题标题】:Socket.IO-client Java with HeaderSocket.IO-client Java with Header
【发布时间】:2018-07-20 01:28:42
【问题描述】:

我有需要用户 ID 才能连接的套接字服务器。因此,我需要将 extraHeader 设置为连接构造函数。我尝试了以下代码,但没有运气。请帮我解决,谢谢。

在连接构造函数中添加额外的标头 'x-user-id': userId

private Socket mSocket;
{
    try {
        IO.Options opts = new IO.Options();
        mSocket = IO.socket(socket_url, opts);
        mSocket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {

                Transport transport = (Transport)args[0];
                transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
                    @Override
                    public void call(Object... args) {
                        @SuppressWarnings("unchecked")
                        Map<String, List<String>> headers = (Map<String, List<String>>)args[0];
                        // modify request headers
                        headers.put("x-user-id", Arrays.asList("5B59F68B7B7811E88C3E52964BF487E4"));
                    }
                }).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
                    @Override
                    public void call(Object... args) {
                    }
                });
            }
        });

    } catch (URISyntaxException e) {}
}

这是我的快速代码。

private init(){
        self.socketManager = SocketManager(socketURL: URL(string:"\(MAIN_URL)/message")!, config: [.log(true),.extraHeaders(["x-user-id":AppManager.instance.userId])])
        self.socket = socketManager?.defaultSocket
    }

【问题讨论】:

    标签: android websocket socket.io-java-client


    【解决方案1】:

    你也可以使用 Spring 框架提供的 stomp 客户端。 要编译并运行以下方法,您应该将 'spring-messaging' 和 'spring-websocket' maven 依赖项添加到您的项目中。

    public ListenableFuture<StompSession> connect() {
        List<Transport> transports = new ArrayList<>(2);
        transports.add(new WebSocketTransport(new StandardWebSocketClient()));
        transports.add(new RestTemplateXhrTransport());
    
        SockJsClient sockJsClient = new SockJsClient(transports);
        sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());
    
        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());
    
        WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
        headers.add("x-user-id", "5B59F68B7B7811E88C3E52964BF487E4");
    
        return stompClient.connect(socket_url, headers, new StompSessionHandlerAdapter() {});
    }
    

    【讨论】:

    • 我们使用 nodejs 作为服务器。通过向传输添加轮询解决了该问题。谢谢
    【解决方案2】:

    问题已在服务器端解决。这是我的配置。 添加这个>>>

    var server = app.listen(3000, {// options can go here
      transports: ['xhr-polling']
    });
    io.use((socket, next) => {
      let clientId = socket.handshake.headers['x-user-id'];
    });
    

    【讨论】:

    • 您真的必须在服务器中指定传输吗?那你如何在客户端处理它?原因,如果在服务器中设置了传输,但没有向客户端添加任何内容,则客户端无法连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多