반이중 통신(Half duplex) 은 양방향 전송이 가능하지만 , 가능한 방향이 정해진 방식이다. 한쪽이 발신을 하면 한쪽은 수신만 가능하며, 하나의 채널을 활용해 교대로 이용한다. 경우에 따라서는 한 방향으로 전송되고, 수신자는 응답만 가능한 경우도 있다.
코드는 단방향 통신을 변형했기 때문에 단방향 통신을 참고하면 된다.
반이중 통신을 위해서는 각 클래스에 BufferedReader 와 BufferedWriter 가 하나씩 필요하다.
1. Server 클래스
public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(3000); System.out.println("클라이언트 연결 중"); Socket socket = serverSocket.accept(); System.out.println("클라이언트 연결 완료"); BufferedReader br1 = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String msg = br1.readLine(); if (msg == null) break; System.out.println(msg); BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw1.write("check\n"); bw1.flush(); } } catch (IOException e) { throw new RuntimeException(e); } } }
BufferedWriter 는 응답이 올 때 마다 실행되야 하기 때문에 반복문에 포함시켰다.
2. Client 클래스
public class Client { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1", 3000); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw.write("안녕 반가워\n"); bw.write("연락 받았니?\n"); bw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String msg = br.readLine(); if (msg == null) break; System.out.println(msg); } } catch (IOException e) { throw new RuntimeException(e); } } }
BufferedReader 를 통해 응답 값을 받으며, 반복문을 통해 출력한다.
3. 실행 결과
서버 클래스 실행 결과
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F404a9fb6-ab9b-45cc-8074-ee63a3334890%2F23cb9dab-6342-4b49-a980-d2d989a29666%2FUntitled.png?table=block&id=54228e2d-6c6b-4e5a-8b48-b230164eb7dc&cache=v2)
클라이언트 클래스 실행 결과
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F404a9fb6-ab9b-45cc-8074-ee63a3334890%2F95e77b3b-f40f-4343-b004-c80980cbecef%2FUntitled.png?table=block&id=61022031-894b-4f2d-a08d-7e6db9545f31&cache=v2)
클라이언트에서 두 번 메세지를 보냈기 때문에 두 번의 응답이 발생했다.
bw.write("안녕 반가워\n"); 에서 \n 을 지우고 실행하면 메세지가 하나로 전송되기 때문에 응답도 한 번만 일어난다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F404a9fb6-ab9b-45cc-8074-ee63a3334890%2F3079d965-93af-411b-b710-1642bc2315f9%2FUntitled.png?table=block&id=fe864ae3-7518-499b-8588-930e5ef5f647&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F404a9fb6-ab9b-45cc-8074-ee63a3334890%2F61d8c9a6-6358-4aaf-823a-8ba7cf8ad348%2FUntitled.png?table=block&id=9561c5e4-182a-49ca-b1e5-57588608a4d8&cache=v2)
Share article