포스트

12. Network

네트워크

1) 정의

  • 여러 대의 컴퓨터를 통신 회선으로 연결한 것

    1_ 서버와 클라이언트
    • 네트워크로 연결된 컴퓨터간의 관계를 역할로 구분한 개념
    • 서버
      • 서비스를 제공하는 프로그램 또는 컴퓨터클라이언트의 연결을 수락하고 요청 내용을 처리 후 응답을 보내는 역할
    • 클라이언트
      • 서비스를 받는 프로그램 또는 컴퓨터네트워크 데이터를 필요로 하는 모든 어플리케이션이 해당됨

    2_ IP 주소

    • 네트워크 상에서 컴퓨터를 식별하는 번호로 네트워크 어댑터마다 할당되어 있다

    3_ 포트(port)

    • 같은 컴퓨터 내에서 프로그램을 식별하는 번호로 클라이언트는 서버 연결 요청 시 IP주소와 포트 번호를 알아야 한다

2) 소켓 프로그래밍

  • 소켓을 이용한 통신 프로그래밍

    1_ 소켓(Socket)
    • 프로세스 간의 통신에 사용되는 양쪽 끝 단

    2_ 프로토콜(Protocol)

    • 컴퓨터 간의 정보를 주고 받을 때의 통신방법에 대한 규약
    • 접속이나, 전달방식, 데이터의형식, 검증 방법 등을 맞추기 위한 약속

    3_ TCP

    • 데이터 전달의 신뢰성을 최대한 보장하기 위한 방식. 연결지향형 통신
    • 전세계적으로 많이 사용. 일일이 확인하고 전달하기 때문에 신뢰성이 높다.

    4_ UDP

    • 데이터의 빠른 전달을 보장하기 위한 방식. 비연결 지향형 통신
    • 스트리밍 서비스에 주로 사용.

3) TCP 소켓 프로그래밍

  • 클라이언트와 서버간의 1:1 소켓 통신
  • 서버가 먼저 실행 후 클라이언트의 요청을 기다림
  • 서버용 프로그램과 클라이언트용 프로그램을 따로 구현
  • 자바에서는 ServerSocket과 Socket 클래스 제공
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
58
59
60
61
62
63
64
65
66
67
< 서버용 TCP 소켓 프로그래밍 순서 >
1. 서버의 포트번호 정함
2. 서버용 소켓 객체 생성
3. 클라이언트 쪽에서 접속 요청이 오길 기다림
4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
5. 연결된 클라이언트와 입출력 스트림 생성
6. 보조 스트림을 통해 성능 개선
7. 스트림을 통해 읽고 쓰기
8. 통신 종료

//1 서버의 포트번호 정함
int port 8500; // port 번호는 0~65535 사이 지정

ServerSocket serverSocket = null;
Socket clientSocket = null;

InputStream is = null;
BufferedReader br = null;

OutputStream os = null;
PrintWriter pw = null;

try {
  // 2 서버용 소켓 객체 생성
  // 3 클라이언트 요청 기다림
  serverSocket = new ServerSocket(port);

  System.out.println("[Server]");
  System.out.println("클라이언트 요청을 기다림");

  // 4 접속 요청이 오면 요청 수락 후 클라이언트 소켓 객체 생성
  clientSocket = serverSocket.accept();

  String clientIP = clientSocket.getInetAddress().getHostAdress();

  System.out.println(clientIP + "가 연결을 요청함");

  // 5 연결된 클라이언트와 입출력 스트림 생성
  is = clientSocket.getInputStream();
  os = clientSocket.getOutputStream();

  // 6 보조 스트림을 통한 성능 개선
  br = new BufferedReader(new InputStreamReader(is));
  pw = new PrintWriter(os);

  // 7 스트림을 통해 읽고 쓰기
  pw.println("[서버 접속 성공]");
  pw.flush();

  // 클라이언트가 서버에게 보낸 메시지 받기
  String message = br.readLine();
  System.out.println(clientIP + "가 보낸 메시지 : " + message);

} catch ( IOException e ) {
  e.printStackTrace();
} finally {
  // 8 통신 종료
  tri {
    if(pw != null) pw.close();
    if(br != null) br.close();
      
    if(serverSocket != null) serverSocket.close();
    if(clientSocket != null) clientSocket.close();
  } catch ( IOException e ) {
    e.printStackTrace();
  }    
}
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
< 클라이언트용 TCP 소켓 프로그래밍 순서 >
1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체 생성
2. 서버와의 입출력 스트림 오픈
3. 보조 스트림을 통해 성능 개선
4. 스트림을 통해 읽고 쓰기
5. 통신 종료

// 1 서버의 IP주소와 서버가 정한 포트번호를 매개변수로
String serverIP = "127. 0. 0. 1"; // loop back ip (내 컴퓨터를 가리키는 ip 주소)
int port = 8500;

Socket clientSocket = null;
BufferedReader br = null;
PrintWriter pw = null;

try {
  // 클라이언트용 소켓 객체 생성
  System.out.println("[Client]");
  clientSocket = new Socket(serverIP, port);

  // 2 서버와 입출력 스트림 오픈
  // 3 보조스트림을 통해 성능 개선
  br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream());
  pw = new PrintWriter(clientSocket.getOutputStream());

  // 4 스트림을 통해 읽고 쓰기
  String message = br.readLine();
  System.out.println("서버로부터 받은 메시지 : " + message);

  Scanner sc = new Scanner(System.in);
  System.out,print("입력 : ");
  String input = sc.nextLine();

  pw.println(input);
  // 작성한 메시지 밀어내기
  pw.flush

} catch ( IOException e ) {
  e.printStackTrace();
} finally {
  // 5 통신 종료
  try {
    if(pw != null) pw.close();
    if(br != null) br.close();
    if(clientSocket != null) clientSocket.close();
  } catch( IOException e) {
    e.printStackTrace();		
  }
}

4) UDP 소켓 프로그래밍

  • UDP는 연결 지향적이지 않기 때문에 연결 요청을 받아줄 서버 소켓이 필요 없음
  • java.net 패키지에서 제공하는 두 개의 DatagramSocket 간에 DatagramPacket으로 변환된 데이터를 주고 받음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< 서버용 UDP 소켓 프로그래밍 순서 >
1. 서버의 포트번호 정함
2. DatagramSocket 객체
3. 연결한 클라이언트 IP주소를 가진 InetAddress 객체 생성
4. 전송할 메시지를 byte[]로 바꿈
5. 전송할 메시지를 DatagramPacket 객체에 담음
6. 소켓 레퍼런스를 사용하여 메시지 전송
7. 소켓 닫음


< 클라이언트용 UDP 소켓 프로그래밍 순서 >
1. 서버가 보낸 메시지를 받을 byte[] 준비
2. DatagramSocket 객체 생성
3. 메시지 받을 DatagramPacket객체 준비
4. byte[]로 받은 메시지를 String으로 바꾸어 출력
5. 소켓 닫음