intelli J 무료판(30일) 좋다
Client와 Server의 클래스를 만들고
socket 연결을 해보자
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// HDX - 스레드가 필요 없다.
public class MyServer {
public MyServer() throws IOException {
// 1. 서버 대기중
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept(); // 리스너 대기중
System.out.println("클라이언트가 연결되었습니다");
// 2.서버 요청 받음 (송수신 선)
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(), "utf-8")
);
while(true){
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("클라이언트에게서 요청이 왔습니다 : "+msg);
// 3. 구문 분석 (파싱)
String responseBody = "";
if(msg.equals("text/html")){
responseBody = "<html><h1>Hello</h1></html>";
}else if(msg.equals("text/plain")){
responseBody = "Hello";
}else{
responseBody = "404 not found";
}
// 4. 서버 응답
writer.write(responseBody);
writer.write("\n");
writer.flush();
//버퍼 비워서 흘리기
}
}
public static void main(String[] args) {
try {
new MyServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client가 문자열을 보내면 Server입장에서 파싱을 한다.
데이터를 계속 받으려면 어떻게 해야할까?
while문을 돌려서 demon 상태로 만들면 된다.
Client나 Server나 socket을 새로 만들 필요도 Buffer를 새로 만들 필요도 없다.
데이터를 받을 곳에만 while을 돌리면 된다.
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* 클라이언트는 read 버퍼를 추가로 만들고
* 서버는 write 버퍼를 추가로 만든다
*/
public class MyClient {
public MyClient() throws IOException {
// 1. 서버 연결
Socket socket = new Socket("127.0.0.1", 10000);
// 2. 버퍼 생성 (송수신 선 만듬)
Scanner keyboard = new Scanner(System.in);
PrintWriter request = new PrintWriter(socket.getOutputStream(), true, StandardCharsets.UTF_8);//자동 플러쉬
BufferedReader response = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
//키보드로 부터 읽는다
);
while(true){
// 3. 키보드로 부터 입력 대기
String requestBody = keyboard.nextLine();
// 4. 서버로 요청
request.println(requestBody);
// 5. 서버로부터 응답
String responseBody = response.readLine();
System.out.println("서버로부터 받은 메시지 : "+responseBody);
}
//소켓을 다시 생성해서 연결할 필요없고 계속 쓰기만 하면 되니까 여기에 while문을 돌려서 demon을 만든다
}
public static void main(String[] args) {
try {
new MyClient();
}catch (Exception e){
e.printStackTrace();
}
}
}
이렇게 무전기같이 동시에 송신이 불가능한 것을 반이중 송신이라고 한다.