API 서버와 클라이언트 소켓 서버를 같이 쓰면 안될까요?

662 views
Skip to first unread message

허우범

unread,
Jan 25, 2016, 1:46:49 AM1/25/16
to Netty Korean User Group

자바 네크워크 소녀를 보면서 공부하고 있는

초보 개발자 입니다.

문자 송수신 관련 개발 업무를 하면서, Netty를 이용해서 한번 변경을 해보려고 하는데요.

책 예제를 통해  API 서버를 만들고, 

API 기능에다가 클라이언트 소켓 통신을 생성해서

API 데이터를 클라이언트를 통해 소켓 서버로 전송하려고 하는데요.

API다 보니.. 클라이언트 소켓 생성이 반복적으로 호출이 될 수 밖에 없는데... 

이것이 괜찮은 방법인지 의문이 듭니다. 

아니면 고정적인 하나의 클라이언트 소켓을 생성하고,

서버로 데이터를 전송하는 부분을 method 처럼 호출해서 사용할 수 있는 방법이 있을까요..?

김경송

unread,
Jan 25, 2016, 9:31:40 PM1/25/16
to Netty Korean User Group
음.. 글로는 확실한 구조가 잘 이해가 안되는데요.

Client#1  <--->   API서버(Netty)  <---> Client #2

이런 구조인건가요?

#1로부터 요청을 받아 #2에 무언가 다시 요청을 하고 응답을 받아 #1로 전달하는 것인가요?
만일 위의 구조라면
소켓을 매번 생성해서 #2에 통신을 할 수도 있고,
소켓을 한개만 생성해 놓고 #2에 통신을 할 수도 있습니다. (둘다 common한 방식들입니다.)

요청에 따라 반복적으로 호출되는건 어쩔 수 없는 것이구요.
관건은 하나의 소켓을 재사용하느냐, 매번 새 소켓을 생성하느냐의 문제로 귀결될듯 합니다.

매번 새소켓을 생성하는 방식은 지금 방식이시고, #2에서 해당 방식을 원활히 지원한다면 '괜찮은 방법'이라고 볼 수 있겠습니다.(애초에 API 서버도 그렇게 동작중이시고..)
1개의 소켓만 이용하시려면 해당 소켓을 연결하여 Channel 객체만 공유하시면,
해당 Channel객체의 writeandflush() 메소드로 바로 연결된 소켓으로 요청을 보낼 수 있습니다.

혹은 proxy 방식으로 이전에 들어온 요청을 이미 연결된 outbound 소켓으로 보내어 처리할 수도 있습니다.

따로 socket만 가지고 처리하고 싶으시면 연결 완료된 Channel 정보를 적당히 공유해서 요청을 보낼때는 Channel을 이용해 보내고,
받을때는 해당 channel에 연결된 handler를 통해서 처리하셔도 됩니다. 


2016년 1월 25일 월요일 오후 3시 46분 49초 UTC+9, 허우범 님의 말:

허우범

unread,
Jan 27, 2016, 8:23:28 PM1/27/16
to Netty Korean User Group
 말 주변이 부족했는데 알아봐주시고 답변 감사드립니다. ㅎㅎ

 제가 지식이 부족하여 핸들러에서 ChannelHandlerContext 가지고 진행해야 하나 생각했던 것 같네요.

 살펴보니, Channel 객체를 활용한다면, 금방 해결이 가능할 것 같습니다.

 말씀해주신대로 받는 부분은 handler에서 처리하면 될 것 같습니다.

 proxy 부분도 참고해보도록 하겠습니다.

 감사합니다. :)
 

2016년 1월 26일 화요일 오전 11시 31분 40초 UTC+9, 김경송 님의 말:
Reply all
Reply to author
Forward
0 new messages