java

[java] AsynchronousServerSocketChannel 를 이용한 비동기 서버

sieunju 2018. 5. 27. 15:46
반응형

안녕하세요. 아직 완성은 되지 않았지만, 간단한 핑퐁은 (클라이언트 1000명 및 패킷교환은 초당 10번정도) 주고 받을수 있는 서버를 소개할려고 합니다.


JNetwork-1.0version.jar


위 파일을 다운 받으신후 알맞은 경로에 위치 시킵니다. 

그후 위 캡처 사진처럼 패키지클릭후 마우스 오른쪽 버튼 클릭 -> Build Path -> Configure Build Path 클릭합니다.

그후 위 캡처 화면에 'Add External JARs..' 버튼 클릭후 JNetwork-1.0version.jar 파일을 추가 합니다. 

그러면 아래 사진처럼

Referenced Libraries안에 추가 된것을 확인할수가 있습니다. 

이후 사용법은 간단합니다. 


우선 자바 클래스 하나를 생성합니다.

그리고 'JNetServer' 를 상속 시킵니다. 

이후, 오버라이드 되는 함수들이 몇개 있는데 추가합니다. 

예시,


Tip.오버라이드 되는 함수는 총 4가지 이고, 이중 onRegMessage()를 제외 하고 나머지는 사용중인 함수입니다. 


이제 서버를 실행해 보겠습니다. 


public class main {

public static void main(String [] args){

JServer server = new JServer();

server.onStart();

}

}


위 코드와 같이 클래스를 초기화 후, onStart라는 함수를 입력해주면 

ip 주소와 포트번호는 default 인 상태로 서버는 실행하게 됩니다. 

ip 주소를 커스텀하게 실행하고 싶으시다면, 

server.setAddress('ip주소',포트번호);

또는 

server.setAddress(포트번호);

이런식으로 설정을 할수가 있습니다. 

대신에 onStart() 함수를 호출하기 전에 설정을 해야 합니다. 

또한, 

setClient(isJava) 라는 함수가 있는데,

이 함수는 서버와 주고 받는 클라이언트가 자바인지 그 나머지 인지에 대한 것입니다. 

제가 이 서버를 만들때에는 C++ 기반 클라이언트로 테스트를 했기때문에 따로 분기 처리한것입니다. 

Tip. 실제로 자바와 그 나머지 언어들의 소켓 통신할때 byte 형식이 조금씩 다릅니다. 


이제 오버라이드 함수에 대해서 설명해보겠습니다. 

onConnect(long netId)

-> 말그대로 클라이언트가 서버와 접속을 시도하여 성공했을때 이 함수로 콜백을 받습니다.


onDisconnect(long netId)

-> 이 역시 클라이언트가 서버와의 접속을 끊었을때 이 함수로 콜백 받습니다.


onMessage(long netId,JNetPacket packet)

-> 이함수는 클라이언트에서 '패킷'을 보냈을 경우 이 함수를 콜백 받습니다.


예시로 보여드리면,

이렇게 스위치 문을 만들어서 각 패킷의 타입에 대하여 각 타입에 맞게 함수를 호출하면 되겠습니다.


서버에서 연산을 다 끝내고 클라이언트에게 패킷을 보내야 한다면,

packet.data 여기에 새로 데이터를 만든후 

'send' 함수를 호출하면 되겠습니다.


설명이 많이 부족한거 같지만, 코드를 천천히 보면 쉽게 사용할수 있도록 설계를 짜보았습니다.

질문 사항있으시면, 댓글에 질문 남겨주시길 바랍니다.

현재 버전으로 소스 받고 싶다면, 비밀댓글로 남겨주시면 되겠습니다. (굳이 이방법 보단 .jar 파일로 다운받아서 사용하시는게 훨씬 편하긴 합니다.)


감사합니다.



반응형