[기술 정리] 24. 소켓과 반이중 통신 (Half-Duplex Communication)

KangHo Lee's avatar
Dec 13, 2024
[기술 정리] 24. 소켓과 반이중 통신 (Half-Duplex Communication)

반이중 통신 (Half-Duplex Communication)

  • 반이중 통신은 데이터가 양방향으로 전송될 수 있지만, 한 번에 한 방향으로만 전송이 가능한 통신 방식을 의미합니다.
  • 양쪽 장치가 번갈아 가며 송신자와 수신자가 될 수 있습니다.
  • 대표적으로 무전기가 있습니다.
    • 한 사용자가 말할 때 다른 사용자는 들을 수만 있습니다.

서버

public class MyServer { public static void main(String[] args) { try { // 1. 리스너 생성 및 대기 ServerSocket serverSocket = new ServerSocket(20000); Socket socket = serverSocket.accept(); // 2. 버퍼 달기 BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); // 3. 요청받고, 응답하기 while (true) { String line = br.readLine(); String response = parser(line); pw.println(response); } } catch (Exception e) { e.printStackTrace(); } } private static String parser(String line) { String header = line.split(":")[0]; String body = line.split(":")[1]; String response = "404"; if (header.equals("buyer")) { if (body.equals("1")) response = "사과"; else if (body.equals("2")) response = "라면"; } if (header.equals("seller")) { if (body.equals("1")) response = "당근"; else if (body.equals("2")) response = "우유"; } return response; } }
  • parser는 간단한 프로토콜을 처리하는 객체
    • ‘ : ‘ 앞 뒤로 특정 문자열이 올 경우 특정 단어를 응답
  • while 반복을 건 이유
    • 통신이 클라이언트 → 서버 → 클라이언트 과정을 거치면 소켓이 닫히고 연결이 종료됩니다.
    • 소켓을 계속 열어서 연결을 끊지 않기 위해 while 반복을 추가했습니다.

클라이언트

public class MyClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 20000); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); Scanner sc = new Scanner(System.in); while (true) { String request = sc.nextLine(); pw.println(request); String line = br.readLine(); System.out.println(line); } } }
  • 여기도 while이 걸려 있는 이유
    • 클라이언트에서 소켓을 닫으면 연결이 끊어지니까 서버 쪽 소켓도 닫힙니다.
 
Share article

devleekangho