본문 바로가기

프로그래밍 회고록/Java & Spring

Java와 java_websocket library를 이용한 WebSocket Clinet쪽 통신방법

728x90
반응형

# 서론

우리쪽 서버가 클라이언트가 되는상황에서 웹소켓 통신을 시도해 보았다. 사용한 라이브러리는 java_websocket라이브러리를 사용했고 코드가 이해하기 단순해지기 때문에 사용했다. 해당 라이브러리를 활용해 Util로 만들어 놓아 모듈화 했으며 참고용에 도움이 되었으면 좋겠다.

라이브러리 github주소는

https://github.com/TooTallNate/Java-WebSocket

 

GitHub - TooTallNate/Java-WebSocket: A barebones WebSocket client and server implementation written in 100% Java.

A barebones WebSocket client and server implementation written in 100% Java. - GitHub - TooTallNate/Java-WebSocket: A barebones WebSocket client and server implementation written in 100% Java.

github.com

다음과 같고 이하 해당 소스를 어떻게 구현했는지 서술하고자 한다.

 

#본론

1. 라이브러리 빌드는 Gradle을 활용했다.

코드는 다음과 같다.

dependencies {
    
    #자바 웹소켓 라이브러리
    compile "org.java-websocket:Java-WebSocket:1.5.1"
    
    #통신하기 위해 json방식으로 보내기 위해 형변환을 위한객체 (필요하다면 사용)
    implementation group: 'org.json', name: 'json', version: '20160810'
    
    
}

 

2. 빌드를 통해 받은 라이브러리를 활용하기 위한 Util Class이다 이 객체가 모듈이 되어 코딩이 이루어진다.

코드는 다음과 같다.

import java.net.URI;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.handshake.ServerHandshake;
import org.json.JSONObject;

public class WebSocketUtil extends WebSocketClient{
	
	private JSONObject obj;
	
	
	public WebSocketUtil(URI serverUri, Draft protocolDraft) {
		super(serverUri, protocolDraft);
	}

	 @Override
     public void onMessage( String message ) {
		 
	  obj = new JSONObject(message);
      
     }

     @Override
     public void onOpen( ServerHandshake handshake ) {
         //System.out.println( "opened connection" );
     }

     @Override
     public void onClose( int code, String reason, boolean remote ) {
         //System.out.println( "closed connection" );
     }

     @Override
     public void onError( Exception ex ) {
         ex.printStackTrace();
     }
     
     public JSONObject getResult() {
 		return this.obj;
 	}

}

2-1) 이 객체에서는 onMessage 메소드가 핵심이다. 통신후에 OnMessage에 데이터가 들어오기에 해당 부분을 원하는대로 데이터를 파싱하는 부분이기 때문이다.

2-2) 그후 JsonObject 변수에 값을 담고 get메소드를 통해 아래 3. 예시 메소드에서 반환값을 가져올 것이다.

 

3. 실제로 웹소켓을 위한 Method를 구현했고

코드는 다음과 같다.

public  getResult() throws Exception{
		
		
 		//실제 uri는 yml에 존재하나, 보안상 다른 예시를 붙여넣는다.
                URI uri = "ws://this.is.example.domain/"
		WebSocketUtil webSocketUtil = new WebSocketUtil(uri, new Draft_6455());
		  
		//웹소켓 커넥팅
		webSocketUtil.connectBlocking();
		  
		JSONObject obj = new JSONObject();
		
		//메세지 던질거 제이슨 형식으로 세팅
		obj.put("message", "Hello World");
		String message = obj.toString();
		  
		//웹소켓 메세지 보내기
		webSocketUtil.send(message);
		
		JSONObject result = webSocketUtil.getResult();
		webSocketUtil.close();
	
		return result;
	}

 

 

# 여담

다른 사람이 작성한 라이브러리를 활용해 내 서버가 클라이언트가 되어 서로 통신하는 모듈을 작성해보았다.

코딩을 할 때 connect() 메소드를 통해 통신엔 성공했는데 메세지 전송과 답변이 오지않는 알 수 없는 오류가 나서 헤맸고 함수들에 대한 설명을 읽다보니 connectBlockingI()이라는 메소드가 따로 존재해서 통신이 성공하기 전까지 다른 스레드?가 동작하지 않게 하는 메소드가 따로 구현되어 있었고 그걸 활용해서 통신 연결된 후 메세지를 보낼 수 있게 되었다 다른사람이 작성한 코드를 활용하는것에도 오류가 날 수 있고 그럴땐 원인파악이 중요한데 그러기 위해선 컴퓨터네트워크 혹은 컴퓨터가 진행되는 순서도에 대해서 좀더 넓은 이해가 필요함을 알게되었다.

728x90