소켓 프로그래밍

아래의 소켓 서버/클라이언트 소스코드는 각각 콘솔에서 실행되며, 클라이언트로부터 한 줄을 입력 받아 서버에서 해당 내용을 출력하고, 다시 그 내용을 클라이언트에 보내면, 클라이언트가 받은 메시지를 출력한다. 테스트를 위해 로컬 호스트 주소를 사용하고 있으며, 포트번호는 11111을 사용했다. 다중 클라이언트에 응답하는 서버를 만드려면 스레드로 처리해야 한다.

소켓 클라이언트

  1. 소켓을 연다.
  2. 소켓에 대해 입출력 스트림을 연다.
  3. 서버의 프로토콜에 맞게 입출력 스트림에서 읽거나 쓴다.
  4. 스트림을 닫는다.
  5. 소켓을 닫는다.
 1 public static void main(String[] args) throws IOException {
 2     // 소켓을 연다.
 3     Socket socket = new Socket(InetAddress.getLocalHost(), 11111);
 4 
 5     // 입출력스트림을 연다.
 6     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
 7     BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream()));
 8 
 9     // 콘솔에서 입력받는다.
10     BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in));
11     String userInput; 
12 
13     while ((userInput = stdIn.readLine()) != null) {
14         // 입력받은 내용을 소켓에 쓴다.
15         out.println(userInput);
16         // 소켓의 응답을 읽어서 출력한다.
17         System.out.println("echo: " + in.readLine());
18     }
19 
20     // 닫는다.
21     out.close();
22     in.close();
23     stdIn.close();
24     socket.close();
25 }


소켓 서버

 1 public static void main(String[] args) throws IOException {
 2     ServerSocket serverSocket = null;
 3     try {
 4         //서버 소켓을 생성한다.
 5         serverSocket = new ServerSocket(11111);
 6     } catch (IOException e) {
 7         System.out.println("Could not listen on port: 11111");
 8         System.exit(-1);
 9     }
10     
11     Socket clientSocket = null;
12     try {
13         // 클라이언트의 접속을 받아들인다.
14         clientSocket = serverSocket.accept();
15     } catch (IOException e) {
16         System.out.println("Accept failed: 11111");
17         System.exit(-1);
18     }
19     
20     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
21     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
22     String inputLine, outputLine;
23 
24     while ((inputLine = in.readLine()) != null) {   
25         // 클라이언트로부터 한 줄을 입력 받아서 콘솔에 출력한다.
26         System.out.println(inputLine);
27         // 입력받은 내용을 클라이언트에 돌려준다.
28         out.println(inputLine);
29         if (inputLine.equals("Bye."))
30             break;
31         }
32 
33     // 닫는다.
34     out.close();
35     in.close();
36     clientSocket.close();
37     serverSocket.close();
38 }


여러 클라이언트에 대해 응답하려면 연결을 받아들인 후에 스레드로 처리하면 된다.
 1 while (true) {
 2     // 연결을 수락
 3     // 클라이언트와의 처리를 담당할 스레드 생성
 4 }

이 블로그의 인기 게시물

좌표 변환: 회전 이동

Unmappable character for encoding MS949

HTTP POST