1-1. 프로토콜이란?

프로토콜은 서로의 약속이다.
마치 아스키 코드처럼, 1을 받으면 '영화'라고 출력해야 한다고 약속하는 것
만약, 1이나 2를 보내지 않으면 exception이 발생하게끔 코드를 짠다!

1-2. 반이중 통신 만들기
[ PrintWriter ]
BufferedWriter로 만들면 new writeStream 뭐 이렇게 길게 만들어야 하거든? 귀찮잖아
PrintWriter로 간단하게 만들 수 있다.
//버퍼 만들기 (send)
1. PrintWriter pw = new PrintWriter(socket.getOutputStream(), true, Charset.forName("UTF-8"));
2. PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
true = flust() 유무
PrintWriter 안에 BufferedWriter가 구현되어 있고,
autoFlush도 boolean 으로 구현되어 있음.
즉, flush()를 작성하지 않고 true만 입력해도 됨!



UTF-8도 달려있어서 1번째 코드처럼 안써도 됨.
[ 전체 코드 ]
[ 프로토콜 ]
<protocol.txt>
1 -> 영화
2 -> 드라마
[ Server ]
package ex17.half;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(20000);
Socket socket = serverSocket.accept();
//소켓 연결 완료됨
//버퍼 만들기 (received)
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
String requestMsg = br.readLine();
System.out.println("클라이언트로부터 받은 메시지 : " + requestMsg);
//버퍼 만들기 (send)
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true, Charset.forName("UTF-8"));
//프로토콜. 마치 아스키 코드처럼 1을 받으면 영화라고 출력
//서버 입장에선 클라이언트한테 받는 responseMsg
if (requestMsg.equals("1")) {
pw.println("영화");
} else if (requestMsg.equals("2")) {
pw.println("드라마");
} else {
pw.println("프로토콜을 확인하세요 : 1은 영화, 2는 드라마");
}
//역슬래시를 몇 번 날릴지 모르기때문에 원랜 while을 돌려야함. 지금은 생략
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
[ Client ]
package ex17.half;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//클라이언트에 소켓이 생겼으니, 서버와 소켓과 클라이언트 소켓이 연결되었겠구나
//포터번호가 20000이니, 서버의 소켓에 연결한게 맞지!
Socket socket = new Socket("localhost", 20000);
//고객은 처음에 쓸거니까 PrintWriter를 먼저 단다
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
//클라이언트 입장에선 request 메세지.
//이 숫자를 보고 통신함. 1을 보내면 영화가 출력될 것
pw.println("1");
//이제 읽어야겠지? 응답한거 답하려고 버퍼드리더 3handshack?
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
String responseMsg = br.readLine();
System.out.println("서버로 부터 받은 메시지 : " + responseMsg);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
[ 결과 ]


만약 3을 입력하면?


반이중 통신은 양방향으로 통신할 수는 있지만 동시에 통신할 수는 없다! (ex. 무전기처럼)
Share article