[webSocket] 메세지 주고 받기

첸첸·2021년 11월 11일
0

webSocket in java

목록 보기
3/9

메세지 보내기


1. 연결로 부터 Session 객체 얻기

  • session 객체는 endpoint의 annotated lifecycle methods의 파라미터로 사용 가능
  • 상대방에 대한 응답 메세지인 경우 , 메세지를 받는 메소드의 내부에서 Session객체 사용 가능(@OnMessage)
  • 응답으로서의 메세지를 보내는 경우가 아니라면, Session 객체를 저장해야 한다. (@OnOpen)

2. Session 객체로 부터 remoteEndpoint 객체 얻기

Session.getBagicRemote는 blocking method, Session.getAsyncRemote 는 nonblocking method로 RemoteEndpoint를 리턴

✔ blocking method in java

작업이 완료 될 때 까지 스레드를 블로킹(대기상태)로 만드는 메소드. 스레드가 블로킹이 되면 다른 일을 할 수 없고 블로킹을 빠져나오기 위해 인터럽트도 할 수 없다. 

3. 상대방에게 메세지를 보내기 위해 remoteEndpoint 사용

void RemoteEndpoint.Basic.sendText(String text) : 텍스트 메세지를 보낼 때 사용. 전체 메세지가 전달 되기 전까지 block
void RemoteEndpoint.Basic.sendBinary(ByteBuffer data) : 바이너리 메세지를 보낼 때 사용. 전체 메세지가 전달 되기 전까지 block
void RemoteEndpoint.sendPing(ByteBuffer appData) : ping frame 을 보냄
oid RemoteEndpoint.sendPong(ByteBuffer appData) : pong frame을 보냄

4. 연결 된 모든 사용자에게 메세지 보내기

일반적으로 하나의 endpoint 클래스는 하나의 연결과, 하나의 사용자만 연관이 되어있다. 그러나 연결 된 모든 사용자에게 메세지를 보내야 하는 경우가 있는데, 이를 위해서 Session 인터페이스는 getOpenSessions 메서드를 제공한다.

@ServerEndpoint("/echoall")
public class EchoAllEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {
      try {
         for (Session sess : session.getOpenSessions()) {
            if (sess.isOpen())
               sess.getBasicRemote().sendText(msg);
         }
      } catch (IOException e) { ... }
   }
}

메세지 받기

@onMessage 를 사용해서 들어오는 메세지들을 핸들링 할 수 있다.

@ServerEndpoint("/receive")
public class ReceiveEndpoint {
   @OnMessage
   public void textMessage(Session session, String msg) {
      System.out.println("Text message: " + msg);
   }
   @OnMessage
   public void binaryMessage(Session session, ByteBuffer msg) {
      System.out.println("Binary message: " + msg.toString());
   }
   @OnMessage
   public void pongMessage(Session session, PongMessage msg) {
      System.out.println("Pong message: " + 
                          msg.getApplicationData().toString());
   }
}

0개의 댓글