반이중 통신 (Half-Duplex Communication)
- 반이중 통신은 데이터가 양방향으로 전송될 수 있지만, 한 번에 한 방향으로만 전송이 가능한 통신 방식을 의미합니다.
- 양쪽 장치가 번갈아 가며 송신자와 수신자가 될 수 있습니다.
- 대표적으로 무전기가 있습니다.
- 한 사용자가 말할 때 다른 사용자는 들을 수만 있습니다.
서버
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) {
String line = br.readLine();
String response = parser(line);
pw.println(response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
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;
}
}
- parser는 간단한 프로토콜을 처리하는 객체
- ‘ : ‘ 앞 뒤로 특정 문자열이 올 경우 특정 단어를 응답
- while 반복을 건 이유
- 통신이 클라이언트 → 서버 → 클라이언트 과정을 거치면 소켓이 닫히고 연결이 종료됩니다.
- 소켓을 계속 열어서 연결을 끊지 않기 위해 while 반복을 추가했습니다.
클라이언트
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);
}
}
}
- 여기도 while이 걸려 있는 이유
- 클라이언트에서 소켓을 닫으면 연결이 끊어지니까 서버 쪽 소켓도 닫힙니다.
Share article