1.클라이언트측


Client(메인프로그램)

UserInfo(유저 정보)
ServerInfo(서버 정보)

//업무관련
ServiceUnit(이벤트 발행자인 Selector와 구독자인  BusinessUnit 을 캡슐화)
BusinessUnit(op_read 이벤트에 반응하는 ReadUnit 과 , 사용자의 입력처리 이벤트(엔터)에 반응하는 WriteUnit을 병렬처리 
캡슐화)

ReadUnit(서버가 보내준 패킷을 PacketUnit을 통해 Command를 받고 해당 명령(화면출력 명령이면 콘솔등에 출력, 
시스템 관련 강제 종료(강퇴등)이면 처리 등의 커맨드 패턴을 구현한 클래스))
WriteUnit(사용자의 입력을 PacketUnit에게 전달후 결과를 통해 Command를 받고 해당 명령 서버에 전송 등을 처리)

//패킷관련 (dto)
PacketUnit(입,출력하는 패킷을 분석해서 Packet헤더, Packet바디, Packet확장 오브젝트를 구성 + 명령을 리턴)

//일반적인 채팅 프로그램은 아래처럼 확장이 안된다.

Data(이런 저런 메세지들의 루트클래스)

SingleData(Data의 하위클래스로 단일 종류의 메세지의 루트클래스)
ChatData(SingleData의 하위 클래스로 채팅용 문자열 메세지)
FileData(SingleData의 하위 클래스로 파일 이미지 전송용)

CommandData(SingleData의 하위 클래스로 특정 명령을 요청하는 데이터의 루트클래스)
LogInData(CommandData의 하위 클래스로 로그 인)
LogoutData(CommandData의 하위 클래스로 로그 아웃)

MultiplexData(Data들의 리스트 클래스로 여러 종류(채팅,커맨드가 뒤섞인) 섞인 메세지의 루트클래스)


패킷 관련해선 java.nio.channels.ScatteringByteChannel; //버퍼에서 읽는다.
java.nio.channels.GatheringByteChannel; //버퍼에 쓴다.  
를 통해 오브젝트 단위로 관리한다.


요 두 인터페이스가 중요한게.. 패킷(헤더+보디...)을 byte버퍼에서 구분해서 사용하게 해준다.
ByteBuffer header = ByteBuffer.allocateDirectBuffer(30); //30byte의 패킷 헤더 설정
ByteBuffer body = ByteBuffer.allocateDirectBuffer(1000); //1000byte의 패킷 보디 설정

header.put("multiplextData");
body.put(imageBuf); //byte로[] 변환된 이미지 데이터
body.put("이미지받아라 요놈앗!');
body.put(iconBuf); 

header.flip();
body.flip();

ByteBuffer[] packet = {header,body}; //이게 게더링(함께) 이다.!

//serverSocketChannel 이든, socketChannel 이든.. GatheringByteChannel을 임플리먼트
int writeLength = serverChannel.write(packet);

요런식으로 처리하면 될라나?


by givingsheart 2014. 1. 1. 16:22