Socket.IO-клиент Java с заголовком - PullRequest
0 голосов
/ 01 июля 2018

У меня есть сервер сокетов, для подключения к которому требуется идентификатор пользователя. Поэтому мне нужно установить 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
    }

Ответы [ 2 ]

0 голосов
/ 19 июля 2018

Проблема исправлена ​​на стороне сервера. Вот моя конфигурация. Добавить это >>>

var server = app.listen(3000, {// options can go here
  transports: ['xhr-polling']
});
io.use((socket, next) => {
  let clientId = socket.handshake.headers['x-user-id'];
});
0 голосов
/ 19 июля 2018

Вы также можете использовать клиент Stomp, предоставляемый Spring Framework. Чтобы скомпилировать и запустить следующий метод, вы должны добавить в свой проект зависимости maven 'spring-messaging' и 'spring-websocket'.

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() {});
}
...