서버
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class EchoServer { public EchoServer() { ServerSocket ss; try { // 1. 서버소켓 생성 ss = new ServerSocket(3000); System.out.println("서버 구동됨"); // 2. 클라이언트의 접속을 기다림 // 서버소켓은 클라이언트의 연결요청이 접수되면 // 해당 클라이언트의 소켓과 송수신할 수 있는 소켓을 생성 // 그리고 해당 소켓을 이용해서 접속된 클라이언트의 // ip 정보를 지니고 있는 inetAddress객체를 얻을 수 있다. // accept() 메소드는 클라이언트의 연결요청이 있을 때까지 대기 // block method이다. Socket s = ss.accept(); System.out.println("클라이언트와 연결할 소켓생성됨"); // 접속한 클라이언트의 IP 정보 얻기 InetAddress inetAddress = s.getInetAddress(); String clientIp = inetAddress.getHostAddress(); System.out.println("[" + clientIp + "] 가 접속됨"); // 3. 소켓으로부터 inputStream과 outputStream 얻기 InputStream is = s.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); OutputStream os = s.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); // 4. clinet가 전송한 메세지 읽기 String message = br.readLine(); System.out.println("[메세지]" + message); // 5. clinet로 메시지 전송하기 bw.write("[" + clientIp + "] 님 환영합니다. \n"); bw.flush(); } catch (IOException e) { // 서버소켓 생성시 지정된 port가 다른 프로그램에서 // 사용 중일 때 예외발생한다. System.out.println("해당 port는 사용 중 입니다."); e.printStackTrace(); } } public static void main(String[] args) { new EchoServer(); } }
클라이언트
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class EchoClient { public EchoClient() { Socket s; try { // 1. 서버와 통신할 소켓 생성 // 연결한 서버의 ip와 port번호를 지정한다. // 소켓을 생성하는 순간 해당 ip의 port번호로 연결을 요청한다. s = new Socket("localhost", 3000); // 2. 소켓으로부터 inputStream과 outputStream 얻기 OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 3. 서버에 메세지 전송하기 bw.write("반갑습니다. 클라이언트 입니다.\n"); bw.flush(); // 4. 서버가 보낸 메세지 읽기 String message = br.readLine(); System.out.println("[서버가 보낸 메세지]" + message); } catch (UnknownHostException e) { // ip에 해당하는 서버를 찾을 수 없을 경우 System.out.println("서버를 찾을 수 없습니다."); e.printStackTrace(); } catch (IOException e) { // 해당 port번호에 어떤 서비스도 존재하지 않는 경우 System.out.println("사용되지 않는 port번호입니다."); e.printStackTrace(); } } public static void main(String[] args) { new EchoClient(); } }