# 서론
우리쪽 서버가 클라이언트가 되는상황에서 웹소켓 통신을 시도해 보았다. 사용한 라이브러리는 java_websocket라이브러리를 사용했고 코드가 이해하기 단순해지기 때문에 사용했다. 해당 라이브러리를 활용해 Util로 만들어 놓아 모듈화 했으며 참고용에 도움이 되었으면 좋겠다.
라이브러리 github주소는
https://github.com/TooTallNate/Java-WebSocket
다음과 같고 이하 해당 소스를 어떻게 구현했는지 서술하고자 한다.
#본론
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()이라는 메소드가 따로 존재해서 통신이 성공하기 전까지 다른 스레드?가 동작하지 않게 하는 메소드가 따로 구현되어 있었고 그걸 활용해서 통신 연결된 후 메세지를 보낼 수 있게 되었다 다른사람이 작성한 코드를 활용하는것에도 오류가 날 수 있고 그럴땐 원인파악이 중요한데 그러기 위해선 컴퓨터네트워크 혹은 컴퓨터가 진행되는 순서도에 대해서 좀더 넓은 이해가 필요함을 알게되었다.
'프로그래밍 회고록 > Java & Spring' 카테고리의 다른 글
Apache Log4j2 보안이슈 와 문제해결 (0) | 2021.12.12 |
---|---|
Java(Spring)와 JavaScript(vue.js)로 서버단 Mp3파일 클라이언트로 보내 재생하기 - 1.Java (2) | 2021.11.03 |
DB JNDI환경설정을 Spring에서 Annotation로 Dbconfig설정하기 (0) | 2021.08.23 |
Filter, Interceptor, Aop가 뭔데? (0) | 2021.01.06 |
JAVA에서 생성자는 메소드일까 (0) | 2021.01.06 |