[TIL] 2022.01.15

Minsu Han·2022년 1월 15일
0

TODAY I LEARNED

목록 보기
15/46
post-thumbnail

오늘 한 일

  • JAVA 복습 (chap18. IO 입출력 및 네트워킹 中 네트워킹)

배운 것

  • TCP 네트워킹 : 연결 지향적 프로토콜. 클라이언트와 서버 간 연결 요청/수락 후 데이터를 정확하고 안정적으로 전달. (네트워크 과목에서 배운 내용을 덧붙이자면 TCP 프로토콜은 정확하고 안정적이며 순서가 보장된 전달을 위해 UDP 프로토콜과 달리 flow, error, congestion control을 한다)
  • TCP 서버의 ServerSocket은 클라이언트의 연결 요청을 기다리다가 수락한 후 Socket을 만들어서 연결된 클라이언트와 통신하게 한다.
  • TCP 클라이언트는 Socket을 생성하여 서버에 연결 요청을 한다.
TCP 네트워킹 예시

// 서버 측
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("도메인 or IP주소", 포트번호));

try {
	Socket socket = serverSocket.accept();	// 연결 수락
} catch (Exception e) { ... }

// 연결된 클라이언트의 IP, 포트 정보 얻기
InetSocketAddress socketAddress = (InetSocketAddress) socket.getRemoteSocketAddress();

serverSocket.close();	// 더 이상 연결 수락이 필요없는 경우 포트 언바인딩

// 클라이언트 측
try {
	Socket socket = new Socket();
	socket.connect(new InetSocketAddress("도메인 or IP주소", 포트번호));	// 연결 요청
	
	socket.close();	// 연결 해제
} catch (UnknownHostException e) {
	// 잘못 표기된 ip주소를 입력한 경우
} catch (IOException e) { 
	// 해당 포트의 서버에 연결할 수 없는 경우
}

// 양쪽의 Socket 객체로부터 데이터 통신을 위해 입출력 스트림을 얻기
Inputstream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
  • ServerSocket의 accept(), Socket의 connect(), 데이터 송수신 read(), write() 등은 동기(블로킹) 방식으로 구동되므로, 서버에 별도의 작업 스레드를 생성하여 다중 클라이언트와 병렬적으로 통신하게 하거나(클라이언트 폭증으로 인한 서버 과부하 우려 있음), 스레드풀을 사용(최대 스레드 수를 제한할 수 있지만 개별 클라이언트의 응답이 느릴 수 있음)하는 등 하는 것이 좋다.

  • UDP 네트워킹: 비연결 지향적 프로토콜, 연결 절차를 거치지 않고 일방적으로 데이터를 발신. TCP보다 빠르지만 순서를 보장하지 않으며 데이터 전달의 신뢰성은 떨어짐.
    DatagramSocket(발신점과 수신점에 해당. send(), receive(), close()...)과 DatagramPacket(주고받는 패킷에 해당)을 사용하여 통신함.


참고자료
이것이 자바다

profile
기록하기

0개의 댓글