반이중 통신(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. 실행 결과
서버 클래스 실행 결과

클라이언트 클래스 실행 결과

클라이언트에서 두 번 메세지를 보냈기 때문에 두 번의 응답이 발생했다. 
 bw.write("안녕 반가워\n"); 에서 \n 을 지우고 실행하면 메세지가 하나로 전송되기 때문에 응답도 한 번만 일어난다.


Share article
