Programing/JAVA

Java Spring boot WebSocket Client 구현 Jetty websocket-client 활용

리커니 2018. 11. 1.
반응형

Java Spring boot WebSocket Client 구현 Jetty websocket-client 활용

 

지난 포스팅에서 Spring boot 에서 Jetty WebSocket Server를 구현하는 방법을 알아보았습니다.

 

Link : Spring boot jetty websocket 서버 개발, 웹소켓 서버 구현

 

이번 포스팅에서는 WebSocket Client 를 구현하는 방법을 알아보겠습니다.

 

[Spec]

Spring boot 2.1.0.RELEASE

Jetty WebSocket Client 9.4.12.v20180830

gradle

 

우선 gradle에 Jetty websocket-client 의존성 주입을 합니다.

compile group: 'org.eclipse.jetty.websocket', name: 'websocket-client', version: '9.4.12.v20180830'

 

 

[WebSocketClientTestApplication.java]

@SpringBootApplication
public class WebSocketClientTestApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(WebSocketClientTestApplication.class, args);
        WsTestClient client = ctx.getBean(WsTestClient.class);
        client.start();
    }
}

 

[WsTestClient]

@Service
public class WsTestClient {
    
    private String destUri = "웹소켓 서버 주소";
    
    public void start(){
        /*Redis 로 올라온 연계 데이터를 웹소켓 클라이언트로 중국에서 개발한 2차센터로 전달*/
        WebSocketClient client = new WebSocketClient();
        SimpleEchoSocket socket = new SimpleEchoSocket();
        
        try{
            client.start();
            URI echoUri = new URI(destUri);
            ClientUpgradeRequest request = new ClientUpgradeRequest();
            client.connect(socket,echoUri,request);
            System.out.printf("Connecting to : %s%n",echoUri);

            socket.awaitClose(5,TimeUnit.SECONDS);
        }catch(Exception e){
            e.printStackTrace();
        }        
    }
}

 

[SimpleEchoSocket]

@WebSocket(maxTextMessageSize = 64 * 1024)
public class SimpleEchoSocket{
    
    private final CountDownLatch closeLatch;
    
    @SuppressWarnings("unused")
    private Session session;

    public SimpleEchoSocket(){
        this.closeLatch = new CountDownLatch(1);
    }

    public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException{
        return this.closeLatch.await(duration,unit);
    }

    @OnWebSocketClose
    public void onClose(int statusCode, String reason){
        System.out.printf("Connection closed: %d - %s%n",statusCode,reason);
        this.session = null;
        this.closeLatch.countDown(); // trigger latch
    }

    @OnWebSocketConnect
    public void onConnect(Session session){
        System.out.printf("Got connect: %s%n",session);
        this.session = session;
        try{
            CommonGlobalVariable.webSocketSession = session;
            Future<Void> fut;
            fut = session.getRemote().sendStringByFuture("Hello");
            fut.get(2,TimeUnit.SECONDS); // wait for send to complete.
        }catch (Throwable t){
            t.printStackTrace();
        }
    }

    @OnWebSocketMessage
    public void onMessage(String msg){
        System.out.printf("Got msg: %s%n",msg);
    }
}

 

프로젝트가 실행이 되어 웹 소켓 서버와 연결이 되면

@OnWebSocketConnect 어노테이션 메소드로 떨어지게 됩니다.

 

 

저의 경우 global static 변수에 연결된 세션정보를 저장 하고 필요 시에 해당 세션으로 메시지를 보내는 방식으로 구현하였습니다.

 

소켓연결이 끊어지면 @OnWebSocketClose 어노테이션 메소드로,

서버로 부터 메세지가 들어오면 @OnWebSocketMessage 어노테이션이 설정된 메소드로 매개변수 값이 들어오게 됩니다.

 

서버로 부터 메시지를 보낼 때는 연결된 세션에서 getRemote() 메소드를 활용해 RemoteEndpoint 를 얻어와

데이터 타입에 따라 다른 메소드를 활용해 전송합니다.

 

 

//예) byteBuffer의 경우

CommonGlobalVariable.webSocketSession.getRemote().sendBytes(buf);
반응형

댓글

💲 추천 글