[java] ServerSocket, Socket
ServerSocket, Socket
ServerSocket은 java에서 서버 프로그램을 개발할 때 쓰이는 클래스이다. 해당 클래스를 이용해서 서버를 개발 하는 방법에 대해 알아보겠다. Socket 클래스는 client에서 서버로 접속하거나 Server에서 accept 하는데 필요한 클래스다. 이 설명을 이해 하려면 TCP/IP 접속 송수신 과정이해가 선행 되어야 한다.
소켓 송수신 과정 설명
ServerSocket, Socket 클래스를 이용한 서버-클라이언트 프로그램을 이해하려면 다음과 같이 TCP/IP 송수신 과정을 이해 해야한다.
서버 |
방향 |
클라이언트 |
클라이언트의 요청을 받기 위한 준비를 한다.(ServerSocket) |
|
|
클라이언트의 요청을 받아 들인다. (accept) |
<- |
서버에 접속 요청을 한다. (Socket) |
클라이언트가 보낸 데이터를 출력 한다. (BufferedReader) |
<- |
서버에 메시지를 보낸다. ( BufferedWriter ) |
클라이언트에 메시지를 보낸다. ( BufferedWriter ) |
-> |
서버가 보낸 메시지를 출력한다. ( BufferedReader ) |
종료 한다. ( socket.close() ) |
|
종료 한다. ( socket.close() ) |
[서버]
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) { try { //서버 생성 ServerSocket serverSocket = new ServerSocket(9000); //client 접속 accept Socket socket = serverSocket.accept();
//client가 보낸 데이터 출력 BufferedReader bufReader = new BufferedReader( new InputStreamReader( socket.getInputStream())); String message = bufReader.readLine(); System.out.println("Message : " + message );
//client에 데이터 전송 BufferedWriter bufWriter = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())); bufWriter.write("hello world"); bufWriter.newLine(); bufWriter.flush();
socket.close(); serverSocket.close(); bufReader.close(); bufWriter.close();
} catch( Exception e ){ e.printStackTrace(); }
} }
|
9000번 port로 설정해 서버를 생성
ServerSocket serverSocket = new ServerSocket(9000); |
클라이언트 요청을 받아 들인다.
Socket socket = serverSocket.accept(); |
[클라이언트]
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args ) { try { //서버 접속 Socket socket = new Socket("127.0.0.1", 9000);
//Server에 보낼 데이터 BufferedWriter bufWriter = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())); bufWriter.write("hello world"); bufWriter.newLine(); bufWriter.flush();
//Server가 보낸 데이터 출력 BufferedReader bufReader = new BufferedReader( new InputStreamReader( socket.getInputStream())); String message = bufReader.readLine(); System.out.println("Message : " + message );
socket.close(); bufReader.close(); bufWriter.close(); } catch( Exception e ){ e.printStackTrace(); }
} } |
127.0.0.1 (localhost) 9000번 서버에 접속
Socket socket = new Socket("127.0.0.1", 9000); |
소켓에서 데이터를 읽을 때
( 예제 기준으로 서버인 경우 클라이언트의 요청을 받는다. 반대로 클라이언트는 서버의 응답을 받는다. )
BufferedReader bufReader = new BufferedReader( new InputStreamReader( socket.getInputStream()))); |
소켓에서 데이터를 쓸 때
( 예제 기준으로 서버인 경우 클라이언트에 응답을 한다. 반대로 클라이언트는 서버의 요청을 한다. )
BufferedWriter bufWriter = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); |