클라이언트와 서버 간에 데이터를 주고받는 흐름을
한 번에 한 방향으로만 데이터가 흐르며, 송신과 수신이 번갈아 가며 이루어짐.
반이중 통신 흐름
- 클라이언트가 요청을 보냄 (
pw.println(request)
)
- 서버는 요청을 읽어들임 (
br.readLine()
)
- 서버는 요청을 처리하고 응답을 생성하여 클라이언트로 전송 (
pw.println(response)
)
- 클라이언트는 서버의 응답을 읽음 (
br.readLine()
)
- 클라이언트는 응답을 출력하거나 추가 작업을 진행
코드
/*
buyer:1 -> 사과
seller:1 -> 당근
buyer:2 -> 라면
seller:2 -> 우유
위 유형이 아니면 404 응답
*/
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) { // 메인 스레드가 while을 반복
String line = br.readLine();
String response = parser(line);
pw.println(response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// parser
// 메서드를 만들고 분리하기
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;
}
}
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);
}
}
}
실행 출력
서버 실행 후 클라이언트 실행
클라이언트가 콘솔 요청시 서버가 요청 응답을 전송

Share article