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