채팅 클라이언트의 두 입력원

콘솔과 네트워크는 서로 기다리지 않는 독립 사건을 만든다.

Client lifetime

콘솔 입력

사용자 속도에 따라 nextLine이 멈춘다.

프레임 인코더

평문과 명령을 서버 문법으로 바꾼다.

Socket reader

입력 여부와 무관하게 원격 메시지를 받는다.

종료 조정자

어느 역할의 종료도 전체 자원을 한 번만 닫는다.

핵심: 한 스트림에는 한 소비자와 한 생산자만 두어 프레임 순서를 보존한다.