[소켓]2. 반이중

gov's avatar
Dec 13, 2024
[소켓]2. 반이중
💡
클라이언트와 서버 간에 데이터를 주고받는 흐름을
한 번에 한 방향으로만 데이터가 흐르며, 송신과 수신이 번갈아 가며 이루어짐.
 

반이중 통신 흐름

  1. 클라이언트요청을 보냄 (pw.println(request))
  1. 서버는 요청을 읽어들임 (br.readLine())
  1. 서버는 요청을 처리하고 응답을 생성하여 클라이언트로 전송 (pw.println(response))
  1. 클라이언트는 서버의 응답읽음 (br.readLine())
  1. 클라이언트는 응답을 출력하거나 추가 작업을 진행

코드

/* buyer:1 -> 사과 seller:1 -> 당근 buyer:2 -> 라면 seller:2 -> 우유 위 유형이 아니면 404 응답 */ 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) { // 메인 스레드가 while을 반복 String line = br.readLine(); String response = parser(line); pw.println(response); } } catch (Exception e) { e.printStackTrace(); } } // parser // 메서드를 만들고 분리하기 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; } }
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); } } }

실행 출력

서버 실행 후 클라이언트 실행
클라이언트가 콘솔 요청시 서버가 요청 응답을 전송
notion image
Share article

goho