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. 소켓 닫음