【问题标题】:Websocket communication versus Netty EnvironmentWebsocket 通信与 Netty 环境
【发布时间】:2020-03-19 08:36:21
【问题描述】:

我需要实现两个 Java 环境之间的通信。接收方是SpringBoot响应式应用,处理通信的sn-p如下(bean的配置我就略过)

@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
    return webSocketSession.send(webSocketSession.receive() // <- Step 0
        .map(message -> {
            log.info("Step 1");
            return message.getPayloadAsText();
        })
        .map(message -> {
            log.info("Step 2");
            return webSocketSession.textMessage(this.receiveMessage(message));
        }));
}

客户端部分是使用 java 11 中的 Http API 实现的

WebSocket webSocket = HttpClient
    .newBuilder().executor(executor).build()
    .newWebSocketBuilder()
    .buildAsync(URI.create(url), new WebSocket.Listener() {
        @Override
        public void onOpen(WebSocket webSocket) {
            log.info("onOpen using subprotocol " + webSocket.getSubprotocol());
            WebSocket.Listener.super.onOpen(webSocket);
        }

        @Override
        public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
            log.info("onText received with data " + data);
            return WebSocket.Listener.super.onText(webSocket, data, last);
        }

        @Override
        public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) {
            log.info("Closed with status " + statusCode + ", reason: " + reason);
            return WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
        }

        @Override
        public void onError(WebSocket webSocket, Throwable error) {
            log.error("Error: " + error.getMessage());
            WebSocket.Listener.super.onError(webSocket, error);
        }

    }).join();


webSocket.sendText(toJSON(List.of("Lorem", "Ipsum", "dolor", "sit", "amet")), true);
webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok").thenRun(() -> log.info("Sent close"));

使用debug,我可以注意到,一旦join()完成并返回WebSocket实例,就会执行receiver第0步的方法并返回Mono&lt;Void&gt;实例。

但问题是即使我发送一些文本,步骤 1 和 2 也永远不会执行!

如果我尝试反向通信(从 SpringBoot 应用程序向 Sender 应用程序发送内容),则会收到消息。

最后,这是onClose 回调在sendClose 语句之后执行的日志。

Closed with status 1002, reason: Server internal error

【问题讨论】:

    标签: java websocket netty


    【解决方案1】:

    解决方案

    由于buildAsync 方法返回CompletableFuture&lt;WebSocket&gt; 的实例,我们需要在使用join() 刷新消息队列之前链接消息的发送

    解决办法

    WebSocket webSocket = HttpClient
        .newBuilder().executor(executor).build()
        .newWebSocketBuilder()
        .buildAsync(URI.create(url), new WebSocket.Listener() {
            @Override
            public void onOpen(WebSocket webSocket) {
                log.info("onOpen using subprotocol " + webSocket.getSubprotocol());
                WebSocket.Listener.super.onOpen(webSocket);
            }
    
            @Override
            public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
                log.info("onText received with data " + data);
                return WebSocket.Listener.super.onText(webSocket, data, last);
            }
    
            @Override
            public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) {
                log.info("Closed with status " + statusCode + ", reason: " + reason);
                return WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
            }
    
            @Override
            public void onError(WebSocket webSocket, Throwable error) {
                log.error("Error: " + error.getMessage());
                WebSocket.Listener.super.onError(webSocket, error);
            }
    
        })
        .thenCompose(ws -> ws.sendText(toJSON(List.of("Lorem", "Ipsum", "dolor", "sit", "amet")), false))
        .thenCompose(ws -> ws.sendText(toJSON(List.of("Lorem", "Ipsum", "dolor", "sit", "amet")), true))
        .thenCompose(ws -> webSocket.sendClose(WebSocket.NORMAL_CLOSURE, ""))
        .join();
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2022-09-24
      • 2020-06-29
      • 1970-01-01
      相关资源
      最近更新 更多