programing

Spring Boot 웹 소켓(StoppSession)이 있는 Django 채널이 작동하지 않음

stoneblock 2023. 8. 2. 08:41

Spring Boot 웹 소켓(StoppSession)이 있는 Django 채널이 작동하지 않음

저기, 우리는 단지 파이썬 코드를 실행하고 결과를 위해 채널을 사용하기 위해 장고를 사용하고 싶습니다.웹 소켓이 제대로 작동하지 않는 모든 것을 구현했습니다.우리의 Angular 프론트엔드에서 Django로 무언가를 보내려고 하면 잘 작동합니다.또한 Spring Boot StompSession 웹 소켓은 다른 Spring Boot 응용 프로그램 및 Angular와 잘 작동합니다.

그러나 장고 3.1.3과 스프링 부트 2.3.3은 그렇지 않습니다.또한 채널 3.0.2, 채널-레디스 3.2.0 및 도커 컨테이너 redis 6이 사용됩니다.

Django 서버 로그에서 확인할 수 있는 내용:

WebSocket HANDSHAKING /ws/card-detection/ [127.0.0.1:53209]
i'm in connect method
WebSocket CONNECT /ws/card-detection/ [127.0.0.1:53209]
i'm in receive method
text_data: CONNECT

이 작업은 웹 소켓 요청이 들어오는 즉시 실행됩니다.

django 소비자(위에 기록된 인쇄물 제외):

class MyConsumer(WebsocketConsumer):
    groups = ["broadcast"]

    def connect(self):
        self.accept()

    def receive(self, text_data=None, bytes_data=None):
        self.send(text_data="Hello world!")

    def disconnect(self, close_code):
        pass

Spring Boot에서 Base64 인코딩 이미지를 보냅니다.하지만 다른 모든 것들도 작동하지 않습니다.보다시피text_data정당한CONNECT.

스프링 부트:

     StompSessionHandler sessionHandler =
         new CardDetectionStompSessionHandler(request, user, webSocketMessagingService);
     createStompClient().connect(djangoServiceWSPath, sessionHandler);
     
   }
 
   private WebSocketStompClient createStompClient() {
     WebSocketClient client = new StandardWebSocketClient();
     WebSocketStompClient stompClient = new WebSocketStompClient(client);
     stompClient.setMessageConverter(new MappingJackson2MessageConverter());
     return stompClient;
   }

스톰프 세션 핸들러는 어떻게 보이는지 알려줍니다.연결 후() 메서드로 이동해야 하지만 다음과 같은 방식으로는 이동하지 않습니다.

 public class CardDetectionStompSessionHandler extends StompSessionHandlerAdapter {
   private final ImageClassificationRequest request;
   private final String username;
   private final String destination = "/card-detection/";
   private final WebSocketMessagingService webSocketMessagingService;
   private StompSession session;
 
   public CardDetectionStompSessionHandler(
       ImageClassificationRequest request,
       String username,
       WebSocketMessagingService webSocketMessagingService) {
     this.request = request;
     this.username = username;
     this.webSocketMessagingService = webSocketMessagingService;
   }
 
   @Override
   public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
     log.info("Client: New session established: {}", session.getSessionId());
     this.session = session;
     session.subscribe("/user/queue/response", this);
     log.info("Client: Subscribed to \"/user/queue/response\"");
     session.send("/app" + destination, request);
     log.info("Client: Message sent to {}", session.getSessionId());
   }
 
   @Override
   public Type getPayloadType(StompHeaders headers) {
     return ImageClassificationResponse.class;
   }
 
   @Override
   public void handleFrame(StompHeaders headers, Object payload) {
     log.info("Client: Message received");
     ImageClassificationResponse response = (ImageClassificationResponse) payload;
     webSocketMessagingService.sendToUser(username, response);
     if (response.isDone()) {
       session.disconnect();
       log.info("Client: Disconnected.");
     }
   }
 
   @Override
   public void handleTransportError(StompSession session, Throwable exception) {
     log.info("Client: Django is not available");
     WebSocketResponse response = new WebSocketResponse();
     response.setDisconnect(true);
     webSocketMessagingService.sendToUser(username, response);
   }
 }

저희가 장고에서 비동기 웹소켓으로 바꾸려고 했는데 하나도 안바뀌었어요.self.accept장고스에서connect()메서드가 응답을 보내지 않거나 Spring Boot을 계속해야 합니다.

언급URL : https://stackoverflow.com/questions/64886685/django-channels-with-spring-boot-websockets-stompsession-do-not-work