java

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

sieunju 2017. 7. 10. 14:18
반응형

안녕하세요 jsieun 입니다.

요번에는 ServerStart.java 와 JSFrame.class 에 대해서 포스팅을 하도록 하겠습니다.

즉, 서버 이벤트 처리와 GUI 에 대해서 설명하도록 하겠습니다.

그럼 소스를 먼저 보도록 하겠습니다.

이것도 마찬가지로, 소스중간중간에 아주 자세히 주석처리로 설명이 되어있습니다.

아 추가적으로 여기엔 메인 메소드가 있어서 이 파일을 실행시켜야 하는데요?

그때 폴더 형식을 좀 추가해야 합니다.

요렇게 icon 폴더 만든후, icon.png 를 넣어야 하는데요

 그 이미지 파일은

<icon.png> 이걸로 사용하시면 되겠습니다.


====키포인트====

이 소스파일에서는 가장 중요하다고 생각 되는 곳은 바로

이 부분이라고 생각이 듭니다.

이부분은 protected 로 보호처리를 해서 상속되어 있는 곳 아니면 사용할수 없게 만들었습니다.

위 사진처럼 ServerStart를 상속걸어논후,


<JNetServer.java 일부분.>

패킷을 읽는 부분에 RegMessage 메소드를 실행하도록 했습니다.

제 서버 플랫폼을 사용해서 사용자에게 맞게 설정할경우, RegMessage 이 부분을 가장 많이 사용할것으로 보여

사용법에 대해서 설명해 드리겠습니다.

우서 패킷의 구조는

 타입

(2bytes)

 

 데이터사이즈

(4bytes)

 

 

 

 데이터

(?bytes)

데이터사이즈

(4bytes)

 

 

 

 데이터

(?bytes)

 ...

 ...

 ...

 ...

이렇게 되어있습니다.

즉, 클라이언트나 서버가 보낼때 로그인을 할지, 채팅 메시지를 보내는 것인지 등등..이러한 "경로"를 정해주는 타입 부분을 앞에 2bytes 먹고, 그다음으론 어떠한 메시지를 보내는 지에 대한 정보값을 넣도록 했습니다.

그리고 그나머지 데이터 부분은

" 데이터사이즈 + 데이터 " 이렇게 구성하였는데, 그 이유는 데이터를 하나만 집어 넣는 것이 아니고, 여러개를 집어 넣고, 그리고 Bytes 형식을 문자열이나 정수형태로 형변환 할때 좀더 깔끔하게 처리 하기 위함입니다.

만약 앞에 데이터 사이즈를 넣지 않고, 그냥 데이터만 넣고

"123","하이요" 이렇게 데이터를 추가를 하면 나중에 형변환 할때 데이터가 깔끔이 처리가 안되는 경우가 있기 때문입니다.

※어차피 바이너리 방식이면 (Stream) 그냥 ObjectStream 형식으로 편히 하면 되지않나..라고 하시는 분들 가끔 계시는데, 그건 그냥 제 맘입니다.ㅋ 저는 저렇게 하는것이 편하고 저렇게 패킷을 하면, 장점이란게 있습니다.

값을 하나하나 깔끔하게 뽑을수 있습니다. 예를 들어 ObjectStream 이러한 형태로 뽑으면, 데이터를 한번에 뽑을수 있지만, 데이터를 경우에 따라서 한번에 뽑거나, 여러개를 뽑을 경우 문제가 생기기 때문에 저는 "제방식" 대로 구상을 했습니다. 머 아무튼.. 이래저래 글이 길었는데,

한마디로 제 맘입니다. ㅋㅋㅎ 그저 저게 더 편해서입니다 ㅎ  

서론이 좀 많이 길었습니다.

다시 본론으로 넘어와서

저 RegMessage 사용법에 대해서 설명해드리도록 하겠습니다.

RegMessage안에 스위치 문 안에서 데이터를 뽑고 추가해서 보낼수 있습니다.

"패킷을 만드는 방법에 대해서 알려드리겠습니다."

처음에 RecvPacket.Type() 으로 타입을 정합니다.

그후에 RecvPacket.Add() 해서 넣고 싶은 데이터를 넣습니다.(int형,String형만 지원합니다. 뭐 long double 이것도 넣으라면 할수 있는데 굳이..필요 없을거 같아서 않넣었습니다.)

그후에 자기 자신에게 보내고싶다? 그럴경우

JServer.Send(RecvPacket, NetId);

로그인한 클라들한테 전체적으로 보내고싶다.

JServer.SendAll(RecvPacket);

그룹된 클라들한테 보내고싶다.

JServer.SendGroup(RecvPacket,"사용자이름");

여기서 유의해야 할 것은 클라이언트가 서버에게 보내고 아무것도 안보내는 경우가 있을 것입니다.

예를 들면 클라이언트내용들을 맵에저장하거나, DB에 저장하고 끝낼경우, 그러면 클라이언트(동기식) 이기 때문에 대기 상태가 됩니다. 그래서

JServer.RecvSend(NetId);

이걸 사용해야 합니다.


궁금한거 있으시면 댓글남겨주시길 바랍니다 :D

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



반응형