소켓통신
소켓이란?
- 양방향 통신, Server와 Client가 특정 Port를 통하여 실시간으로 양방향적 통신 방식으로, 양방향이기 때문에, Server도 Client에게 요청을 보낼 수 있다. 실시간 요청과 통신 및 응답 등이 필요한 경우에 주로 사용한다
- 소켓은 네트워크 통신을 위한 프로그램의 종착점, 즉 창구 역할을 합니다. 클라이언트와 서버는 각각 소켓을 생성하여 통신을 시작합니다
- 소켓은 프로세스간 통신 끝에 위치하며 클라이언트와 서버가 데이터를 주고 받는데 사용된다.
- 소켓은 OS에 의해 관리되며, IP주소와 포트번호로 식별한다. 소켓 주소는 ip + port번호
소켓통신
- 소켓을 이용하여 클라이언트- 서버 간에 데이터를 주고 받는 방식
- 송신측을 서버, 수신측을 클라이언트라고 말하며, 양뱡항 통신한다.
소켓 통신동작
- (서버) 요청수신 준비
- 소켓 객체 생성(ip + portnumber : 소켓 주소)
- 포트 바인딩
- 소켓 listen()
- (클라이언트) 소켓주소에 connect 요청
- (서버) 요청받으면 connect()됨
- (서버/클라이언트) send()/recv() 양방향 소통
- connect()해제
TCP/IP 소켓통신 예시
[서버] socket() -> bind() -> listen() -> accept() -> recv()/send()
[클라] socket() -> connect() -> send()/recv()
자바로 서버 소켓 간단한 구현
ServerSocket socket = new ServerSocket(8000);
Socket socker = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socker.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String msg = in.readLine();
Socket client = new Socket("localhost", 8000);
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
멀티 클라이언트 채팅 예제 동작 흐름(TCP)
- 서버 소켓 준비
- ServerSocker 생성후 포트지정하고 bind()
- listen()하여 클라이언트와의 연결 요청 대기
- 클라이언트 연결 요청
- 클라이언트에서 Socker(host, port)로 서버 접속 시도
- TCP 3-way-handshake로 연결 수립
- 서버에서 연결 수락
- accept()가 반환한 Socket으로 클라이언트와 1:1 통신 채널 생성
- 해당 소켓을 처리할 쓰레드를 생성
- 닉네임 설정
- 클라이언트는 서버에 닉네임설정
- 서버는 닉네임 중복 여부 검사 후 등록
- 전체 사용자 목록에 추가, 기존 사용자들에게 입장 알림
- 메시지 송수신
- 클라이언트가 채팅 메시지 전송하여 서버가 수신
- 서버는 메시지를 읽어 명령어/일반메시지인지 판별
- 일반메시지이면 모든 사용자에게 브로드캐스트
- 브로드 캐스트 처리
- 서버는 모든 연결된 세션의 출력 스트림에 메시지를 전송
- 자신을 제외 or 특정 대상에게만 전송
- 연결 종료
- 클라이언트에서 소켓 닫기
- 서버는 세션목록에서 제거후 나머지사용자에게 퇴장알림
- 소켓과 스트림 자원 해제