java

[자바/JAVA] nio 를 이용한 소켓 서버 (GUI 연동) 2.0 Version 2부 (서버부분)

sieunju 2017. 7. 10. 12:12
반응형


안녕하세요 jsieun 입니다.

사용법

- http://jsieun73.tistory.com/140

새롭게 업데이트된 nio-서버 구조에 대해서 사진으로 쉽게 설명하자면,

아래 사진이라고 보시면 되겠습니다.


뼈대라고 부르는 JNetServer.java 안에 Bind, Accept, Read, Write, Disconnect, 등등..

서버에 관련된 것들이 들어있고, ServerStart.java 안에는 클라이언트로 부터 받은 데이터를 가지고

이벤트 처리하는 즉, RecvMessage 가 있습니다. 

그리고 사용자 편의를 위해서 GUI 를 넣어서 1초마다 Connect , DisConect, RegMsg 의 값을

갱신해주는 JSFrame.class 이렇게 있습니다.

그럼 먼저 뼈대라고 부르는 소스부터 보도록 하겠습니다.

JNetServer.java 소스입니다.

소스해석은 이미 주석으로 깔끔하게 해서 그렇게 할필요는 없어보입니다.

(궁금한부분이 있으면, 댓글로 남겨주시면 됩니다^^, 자질구래한것도 응답해드립니다.)

=======Nio방식이란?=======

(지금부터는 제가 지금까지 서버와 클라이언트를 C/C++,C#,Java로 구현해보고,

공부하면서 얻은 지극히 주관적인 의견입니다. )

nio 즉, Non-Blocking 이라고 하는 것이 무엇인지 간단히 설명해보겠습니다.

블록킹상태란? 내가 데이터를 보내기전까지 얘내들은 아무것도 못하는 상태이고,

논블록킹 상태는 내가 데이터를 보내면서 다른일을 할수 있는 상태를 뜻합니다.


이거와 비슷한 예로 동기식 소켓구현과, 비동기식 소켓구현이 있습니다.

동기식이란, 클라이언트가 서버한테 패킷을 보내고 받기(무조건 받아야함)까지 클라는 대기상태로 변해서 그동안 아무것도 못합니다.

즉, 서버가 패킷을 보내는게 늦어지면 클라이언트도 계속 로딩중.... 이러한 화면이 나오게 됩니다.

예를들면,

은행 앱에서 로그인을 할경우, "로딩중..." 이러고 아무것도 못하게 되는 데 이걸 동기식이라고 생각하시면 될거 같습니다.

비동기식은 내가 서버한테 패킷을 보내고 "머 언젠간 패킷을 받겠지~" 이러면서 클라이언트는 할일 하게 됩니다.

하지만, 동기화를 잘처리해줘야합니다.(정말 중요합니다.)

예를 들면,

FPS게임을 하다보면 총을 쏴서 적군을 맞추게 되는데, 그때 적군을 맞추고 멈추는것이 아닌, 적군을 맞추고 아주 자유롭게 움직일수 있고, 다른 일들을 할수 있는데 이것을 비동기식이라고 생각하시면 될거 같습니다.

비동기식,동기식,블록킹,논블록킹을 정말 간단히 설명해보았는데요,

이제부터는 저 위에 있는 소스에서 "SocketChannel" 을가지고 클라이언트의 NetId를 가지고, 원하는 클라이언트에게 패킷을 보내는 것을 볼수가 있습니다. 여기서 NetId 가 어떤거냐면,

서버를 Power ON! 하고, 클라이언트는 접속하게 되는데, 그때 접속한 클라이언트들 마다 이름을 할당해줍니다.

그걸 보고 저는 NetId 라고 부르는 것입니다. (key값이라고 하는 경우도 있습니다.)

음..중단점을 걸어서 확인해보면

java.nio.channels.SocketChannel[connected local=/IP주소입니다~:20000 remote=/IP주소입니다~:14329]

이런식으로 숫자가 지정되어있습니다.

이렇게 목적지가 정해져있으니, 원하는 상대와 그룹화를 제대로 처리해줄수 있습니다.


아 그리고, TCP와 UDP 의 차이점 궁금해 하실텐데요

이것또한 간단히 말해드리겠습니다.

TCP는 안전빵 but, 느림(그래봤자 사람이 눈치채는 속도는 아니라고봄.인터넷환경이 70년대면 눈치챌수도?)

UDP는 굇수, but 노안전 (IP계의 베스같은놈)

정말 간단하죠?ㅋㅋㅋㅋ 우리나라 같은 경우에는 거진다 TCP를 사용한다고 보면되고, 외국같은 경우에는

정말 반응속도에 예민한 게임 같은 경우, UDP를 사용한다고들 합니다.(여담..)


이상 포스팅을 마치도록 하겠습니다. 감사합니다.




반응형