티스토리 뷰

Skill/Programming - Network

16. 서버 소켓

gyulee0220 2019. 8. 16. 14:14



1. 서버 소켓(Server Socket)

  서버 소켓은 클라이언트의 연결 요청을 서버가 받기 위해 존재한다. 서버 소켓은 서버에서 실행 되며 클라이언트에서 오는 연결을 서버 장비의 특정 포트에 연결을 시켜준다. 클라이언트의 요청을 받은 서버는 해당 요청을 읽고 클라이언트가 요청한 정보를 다시 서버 소켓을 통해 보내주게 된다.


  서버 소켓의 일반적인 실행 흐름은 다음과 같다


  • 특정 포트에서 연결을 받기 위해 서버 소켓을 생성한다. 이렇게 생성된 소켓은 클라이언트의 요청이 올때 까지 대기하게 된다.
  • 서버 소켓은 accept() 메소드를 사용하여 클라이언트의 연결을 대기한다.
  • 서버 소켓에서 InputStream / OutputStream 을 이용해 클라이언트와의 통신에 필요한 데이터를 주고 받는다.
  • 정해진 프로토콜 (TCP, UDP..)에 따라 클라이언트와 통신을 한다.
  • 통신이 종료되면 다시 서버 소켓은 대기 상태로 돌아간다.
  
  서버 소켓의 매커니즘은 아래와 같이 정리할 수 있다.



2. 서버 소켓 만들기


  위에서 서버 소켓의 매커니즘을 알게 되었고, 해당 매커니즘을 통해 서버 소켓을 선언 하는 과정은 아래와 같이 만들 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class Solution {
    public final static int PORT = 13;
    
    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
        ServerSocket server = new ServerSocket(PORT);
        while(true){
            try (Socket connection = server.accept()){
                Writer out = new OutputStreamWriter(connection.getOutputStream());
                Date now = new Date();
                out.write(now.toString() +"\r\n");
                out.flush();
            } catch (IOException ex){
                System.err.println(ex.getMessage());
            }
        }
        
    }
}
 
cs


  서버 소켓의 경우 특정 포트에 맞게 생성 할 수 있으므로, 반드시 위처럼 포트 번호로 서버 소켓을 선언해야 한다. 하지만, 위의 코드를 살퍄보면 소켓의 선언까지는 작동하나, 예외처리 부분과 close()는 만들어지지 않았다. 만약 소켓의 생성이나 연결이 실패할 경우의 예외 처리 및 소켓 종료 부분까지 추가 한다면 아래와 같이 선언할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
 
public class Solution {
 
    public final static int PORT = 13;
    
    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
 
        ServerSocket server = new ServerSocket(PORT);
 
        while(true){
            try (Socket connection = server.accept()){
                Writer out = new OutputStreamWriter(connection.getOutputStream());
                Date now = new Date();
                out.write(now.toString() +"\r\n");
                out.flush();
                connection.close();
            } catch (IOException ex){
                System.err.println(ex.getMessage());
            } finally {
                try {
                    if (server != null) server.close();
                } catch (IOException ex) {}
            }
        }
        
    }
}
 
cs



3. 에코 서버 구현


  에코 서버는 클라이언트로 부터 받은 요청을 그대로 다시 돌려주는 서버를 의미한다. 에코 서버의 가장 큰 특징은 클라이언트가 서버로 부터 얼마나 큰 크기의 데이터를 받을 지 예상할 수 있다는 점이다. 자신이 보낸 만큼의 데이터를 그대로 돌려 받기 떄문에, 받을 데이터의 크기 예상이 가능하고 비교적 손 쉽게 프로그래밍을 진행 할 수 있다.


  위에 서버 소켓 생성을 이용해 에코 서버를 구현하면 아래와 같이 만들 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Solution {
 
    public final static int PORT = 13;    // 포트 번호
    
    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
 
        // 서버 소켓 만들기
        ServerSocket server = new ServerSocket(PORT);
 
        InputStream is = null;
        InputStreamReader isr = null;
 
        OutputStream os = null;
        OutputStreamWriter osw = null;
        
        String data = null;
        
        while(true){
            // 서버가 대기상태로 들어 감
            try (Socket connection = server.accept()){
                // InputStream 생성
                is = connection.getInputStream();
                isr = new InputStreamReader(is);
                
                // OutputStream 생성
                os = connection.getOutputStream();
                osw = new OutputStreamWriter(os);
                
                while((data = (String)isr.toString())!= null){
                    
                    osw.write(data);
                    os.flush();
                }
                
                is.close();
                isr.close();
                os.close();
                osw.close();
                connection.close();
            } catch (IOException ex){
                ex.printStackTrace();
                System.exit(0);
            } 
        }
        
    }
}
 
cs




'Skill > Programming - Network' 카테고리의 다른 글

18. 서버 소켓 프로그래밍 예제 (Java)  (0) 2019.09.08
17. 네트워크 보안 및 보안 소켓  (0) 2019.08.31
15. 클라이언트 소켓  (0) 2019.08.04
14. HTTP 쿠키 (Cookie)  (0) 2019.07.28
13. HTTP 요청  (0) 2019.07.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함