서버가 기다리고 있어야 하니까 서버부터 실행하고 클라이언트 실행하자
package ex17.oneway; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; // 통신을 하는데 버퍼가 안 달린 것은 없다. public class Server { public static void main(String[] args) { try { // 데이터가 컴퓨터까지 도착하는 것은 IP를 통해서지만 카톡인지 네이트온인지 알 수 있는 것은 포트 번호 때문이다. 그게 위에 적힌 10000 ServerSocket serverSocket = new ServerSocket(10000); System.out.println("ServerSocket 연결됨"); Socket socket = serverSocket.accept(); // 누가 나에게 요청하는지를 확인하는 리스너 System.out.println("클라이언트 연결됨"); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); while (true) { String msg = br.readLine(); if (msg == null) { break; } System.out.println(msg); } /** * 왜 소켓을 두 개 만드냐? * ServerSocket: 연결용. 연결되고 나면 이 선을 끊고 Socket으로 선을 새로 만들어서 연결한다. * 왜? 서버라는 것은 한 명의 요청만 받는 것이 아닌데 한 번에 한 명의 요청만 받을 수 있다. 서버소켓이 계속 연결되어 있으면 다른 사람의 요청을 들을 수가 없어. 그래서 소켓을 새로 만들어. * 그래서 스레드가 필요하다. * 스레드는 리스너에 하나 + 연결된 클라이언트 숫자만큼!! n+1 * Socket: 진짜루 얘로 통신함. 얘의 포트번호는 랜덤이야. 신경쓰지말어. */ } catch (IOException e) { throw new RuntimeException(e); } } }
package ex17.oneway; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; import java.nio.charset.StandardCharsets; // 단방향 public class Client { public static void main(String[] args) { try { // localhost = 127.0.0.1(루프백) Socket socket = new Socket("127.0.0.1", 10000); // 이 소켓이 버퍼드 라이터의 타겟이 되는 것이다. // Scanner sc = new Scanner(System.in); // String msg = sc.nextLine(); String msg1 = "ㅎ후후"; String msg2 = "헤헤헤"; // 가나다라abc BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)); // 소켓도 방향이 있는데 줄건지 받을건지를 체크하고 하자. // 버퍼드리더한테 나 인코딩이 유티에프8이야. 그렇게 끊어 읽어. 라고 말해주는 것이다. 오에스한테도 그렇게 말하는 것이다. bw.write(msg1 + "\n"); bw.write(msg2); bw.flush(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
Share article