Websocket 통신 대 Netty 환경

마우로 데 팔마

두 Java 환경 간의 통신을 구현해야합니다. 수신자는 SpringBoot 리 액티브 애플리케이션이고 통신을 처리하기위한 스 니펫은 다음과 같습니다 (빈 구성은 건너 뛰겠습니다).

@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"));

디버그를 사용하면 join()이 완료되고 WebSocket인스턴스가 반환되면 수신자의 Step 0에서 메서드가 실행되고 Mono<Void>인스턴스가 반환 됨을 알 수 있습니다 .

하지만 문제는 내가 문자를 보내도 1 단계와 2 단계가 실행되지 않는다는 것입니다!

역방향 통신을 시도하면 (SpringBoot 애플리케이션에서 Sender 앱으로 무언가 전송) 메시지가 수신됩니다.

마지막으로 이것은 명령문 onClose이후의 콜백 실행 로그입니다 sendClose.

Closed with status 1002, reason: Server internal error
마우로 데 팔마

해결책

buildAsync메서드가의 인스턴스를 반환 하므로 다음을 CompletableFuture<WebSocket>사용하여 메시지 대기열을 플러시하기 전에 메시지 전송 체인이 필요합니다.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();

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Websocket communication versus Netty Environment

분류에서Dev

Websocket 통신 지연 질문

분류에서Dev

auditctl 통신 대 exe

분류에서Dev

잘못된 파일 이름으로 Excel 통합 문서를 여는 경우 오류 대신 메시지 반환

분류에서Dev

Spring Websocket과 통신하는 방법

분류에서Dev

IBM Cloud : API를 통해 버킷에 대한 S3 호환 신임 작성

분류에서Dev

icu4j는 기호 대신 통화 코드를 반환합니다.

분류에서Dev

객체를 통해 반복되는 Javascript, 반복 경로 대신 참조 사용

분류에서Dev

Blazeface에서 값 대신 텐서를 반환하는 경우

분류에서Dev

pubspec 환경 / sdk / "^ 2.7.0"대신 " '> = 2.7.0 <3.0.0'"을 사용하는 이유

분류에서Dev

Ubuntu 기본 데스크탑 환경 대신 Gnome

분류에서Dev

LINQ 쿼리가 NULL 인 경우 DateTime 대신 문자열 반환

분류에서Dev

명령 줄 대신 프롬프트로 환경 변수 설정

분류에서Dev

Ansible 명령은 성공 대신 변경을 반환합니다.

분류에서Dev

컨트롤러 대신 경로에서 뷰 반환

분류에서Dev

벡터 대신 벡터 반복기를 반환하는 경우

분류에서Dev

Webclient를 통한 Windowsphone 대 PHP 통신

분류에서Dev

어떻게 "클래스 경로에 대한 조회 결과의 Netty의 기본 epoll 파일 전송을하지만, epoll에 사용할 수 없습니다. NIO 대신 사용"을 해결하는 경고를?

분류에서Dev

톰캣 대의 Netty는 후드를 사용하는 경우 봄 webFlux는 differrences

분류에서Dev

cv2.imdecode ()는 Websocket을 통해 수신 된 base64의 이미지, mimetype 이미지 / jpeg에서 None을 반환합니다.

분류에서Dev

Spyder가 가상 환경 대신 기본 환경의 라이브러리를 사용하는 이유

분류에서Dev

VirtualEnv는 환경을 만듭니다. 깨끗한 환경 대신 모든 시스템 전체 패키지

분류에서Dev

Datatables-JavaScript를 통한 언어 변경으로 인해 언어 변경 대신 UI 요소가 사라짐

분류에서Dev

Swoole WebSocket Server-클라이언트 간 통신

분류에서Dev

Map은 후속 호출을 통해 추론되는 대신 Object를 반환합니다.

분류에서Dev

SubscriptionInfo.getMnc ()는 이동 통신사가 다른 두 SIM에 대해 동일한 값을 반환합니다.

분류에서Dev

Object 대신 Future <Object> 반환

분류에서Dev

-1 대신 NaN 반환

분류에서Dev

atof () double 대신 float 반환

Related 관련 기사

  1. 1

    Websocket communication versus Netty Environment

  2. 2

    Websocket 통신 지연 질문

  3. 3

    auditctl 통신 대 exe

  4. 4

    잘못된 파일 이름으로 Excel 통합 문서를 여는 경우 오류 대신 메시지 반환

  5. 5

    Spring Websocket과 통신하는 방법

  6. 6

    IBM Cloud : API를 통해 버킷에 대한 S3 호환 신임 작성

  7. 7

    icu4j는 기호 대신 통화 코드를 반환합니다.

  8. 8

    객체를 통해 반복되는 Javascript, 반복 경로 대신 참조 사용

  9. 9

    Blazeface에서 값 대신 텐서를 반환하는 경우

  10. 10

    pubspec 환경 / sdk / "^ 2.7.0"대신 " '> = 2.7.0 <3.0.0'"을 사용하는 이유

  11. 11

    Ubuntu 기본 데스크탑 환경 대신 Gnome

  12. 12

    LINQ 쿼리가 NULL 인 경우 DateTime 대신 문자열 반환

  13. 13

    명령 줄 대신 프롬프트로 환경 변수 설정

  14. 14

    Ansible 명령은 성공 대신 변경을 반환합니다.

  15. 15

    컨트롤러 대신 경로에서 뷰 반환

  16. 16

    벡터 대신 벡터 반복기를 반환하는 경우

  17. 17

    Webclient를 통한 Windowsphone 대 PHP 통신

  18. 18

    어떻게 "클래스 경로에 대한 조회 결과의 Netty의 기본 epoll 파일 전송을하지만, epoll에 사용할 수 없습니다. NIO 대신 사용"을 해결하는 경고를?

  19. 19

    톰캣 대의 Netty는 후드를 사용하는 경우 봄 webFlux는 differrences

  20. 20

    cv2.imdecode ()는 Websocket을 통해 수신 된 base64의 이미지, mimetype 이미지 / jpeg에서 None을 반환합니다.

  21. 21

    Spyder가 가상 환경 대신 기본 환경의 라이브러리를 사용하는 이유

  22. 22

    VirtualEnv는 환경을 만듭니다. 깨끗한 환경 대신 모든 시스템 전체 패키지

  23. 23

    Datatables-JavaScript를 통한 언어 변경으로 인해 언어 변경 대신 UI 요소가 사라짐

  24. 24

    Swoole WebSocket Server-클라이언트 간 통신

  25. 25

    Map은 후속 호출을 통해 추론되는 대신 Object를 반환합니다.

  26. 26

    SubscriptionInfo.getMnc ()는 이동 통신사가 다른 두 SIM에 대해 동일한 값을 반환합니다.

  27. 27

    Object 대신 Future <Object> 반환

  28. 28

    -1 대신 NaN 반환

  29. 29

    atof () double 대신 float 반환

뜨겁다태그

보관