반이중 통신(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