Java OIO 와 NIO 쓰레드/시퀀스 모형도
JAVA OIO
그림에 있는 순서대로 흘러가면 됩니다.
- 서버쪽에서는 Accept 를 통해 클라이언트의 접속을 기다리며
- 접속이 되면 , 해당 클라이언트만을 위한 쓰레드를 생성합니다.
- 그 후 클라이언트는 그 쓰레드와 통신을 하게됩니다.
- 결국 클라이언트 만큼 쓰레드가 서버에 생성됩니다.
JAVA NIO
- 위 그림의 Java NIO 서버는 Hadoop 이라는 오픈소스 코어에서 가져왔습니다.
- 클라이언트측은 OIO (Old Input/Output) 이며, 서버는 NIO (New input /output) 입니다.
- 셀렉터, 채널 , 바이트버퍼의 개념을 알아야 이해할수있습니다.
- 보시다시피 굉장히 복잡하기때문에 , 스스로 만드는것 보다는 오래 검증된 라이브러리 (Netty) 같은것을
사용하는편이 안전합니다.
- 클라이언트와 쓰레드 갯수와 무관해집니다.
위의 그림은 오프라인 스터디용으로 작성하였기때문에, 여기에 구체적인 설명은 하지 않겠습니다. ^^
P.S
TCP 는 연결지향이지만 메세지의 끝이 불분명하기때문에 양측에서 메세지의 처음과 끝을 약속하여 처리합니다.
- 문자열을 보낼때, 라인단위로 보냅니다. 그러면 수신측에서는 /n 을 발견할때까지 읽어서 처리합니다.
- /n 를 하나의 메세지의 끝으로 약속했을때, 메세지 안에 바이너리 데이터가 있다면 Base64 등으로 문자인코딩함.
- 처음 4바이트를 읽어서, 메세지의 길이를 확인한후에 길이만큼 바이트를 읽습니다. ( 위에 하둡에서 이렇게 처리)
- sync:cmd:datal-length:-------- data ------------:endSync 이런식으로 완전한 패킷정의