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);
'Programing > JAVA' 카테고리의 다른 글
JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue Stream 1부 List (0) | 2018.11.12 |
---|---|
Logback 특정 문자열 포함하는 메시지 제외 설정, Filter 사용법 (0) | 2018.11.02 |
JAVA json 객체를 VO, List<VO> 로 파싱하는 방법 json to Java Class, Json to object (2) | 2018.10.30 |
Mybatis insert, update null 처리, 부적합한 열 유형 처리방법, Oracle Merge (0) | 2018.10.11 |
Spring Framework DBCP HikariCP 적용방법 (0) | 2018.09.05 |
댓글