- 네트워크란, 쉽게말하면 두대이상의 컴퓨터가 데이터를 주고받는다. 라는 개념
- 예전에는 애뮬레이터를 가지고 서버에 접속해야 데이터를 주고 받을 수 있었다.
- => 모든 컴퓨터가 데이터를 주고받을 수 없다는 단점이 있음
- => 인터넷이라는 개념이 생김
- 프로토콜개념이 생김(통신규약) - IP(Internet Protocol), TCP, UDP
- tcp , udp : 데이터를 주고받을때의 약속
통신규약 | 설명 | |
주소 | IP | - 종류 : IPv4(32bit) , IPv6(128bit) - 절대 충돌이 되서는 안됨 - 네트워크 고유값임 |
네트워크 서비스 |
TCP | 신뢰할 수 있는 통신 |
UDP | 신뢰할 수 없는 통신 - 종류 : ftp(21)/smtp(25)/domain(53)/www(80)/pop3(110) - 동일한 포트를 통해서만 동일한 정보를 주고받는다.(괄호안의 숫자는 포트숫자) |
- Hub : 컴퓨터들을 LAN에 접속시키는 네트워크 장치로 스위칭 허브라고도 한다.
- 이더넷 : 네트워크 규격
- 브로드 캐스트 : 브로드캐스팅은 송신 호스트가 전송한 데이터가 네트워크에 연결된 모든 호스트에 전송되는 방식을 의미한다.
- router : 네트워크 증폭기
IP | TCP | UDP |
InelAddress | 서버와 클라이언트가 있어야함 서버 : 정보를 전달하는 곳 클라이언트 : 정보를 받는 곳 |
서버와 클라이언트가 따로 없음 |
**네트워크도 입출력임
[TCP통신]
1) 서버소켓
- TCP프로그램에서 서버를 담당
- 클라이언트의 접속을 기다리는 기능을 한다.
- 데이터를 주고받기 위해서는 특정 포트를 활성화 시켜야 한다.
- 전달된 포트를 다른 네트워크 프로그램이 사용할 경우 IOException발생
- accept() 메소드 : 클라이언트의 접속을 기다리는 메소드
- 클라이언트가 접속 될 경우 : 클라이언트의 소켓과 연결될 클라이언트 소켓인스턴스를 반환한다.
- 클라이언트가 접속되기 전까지 : 스레드 일시중지 되어있다.
- 연결될 소켓 인스턴스를 생성하여 반환 후, 스레드를 재실행 한다.
**포트란? 인터넷을 이용하여 값을 전달하기 위한 논리적인 고유값이다.
1) (클라이언트)소켓
- 서버에 접속하는 기능을 제공한다.
- socket인스턴스를 생성하면 서버에 접속 가능해 진다.
- 서버이름(IP주소)과 포트번호를 전달하여 인스턴스를 생성해야한다.
- UnkownHostException, IOException(서버가 실행상태가 아닌경우)발생할 수 있다.
- 입출력스트림을 반환받는 getInputStream(), getOutPutStream() 메소드가 존재
Remote IPAddress 접속된 컴퓨터의 네트워크 정보를 반환 |
socket.getInetAddress().getHostAddress() |
Remote Port Address 접속된 컴퓨터의 포트번호를 반환하는 메소드 |
socket.getPort() |
Local IP Address 현재 접속된 컴퓨터의 네트워크정보를 반환 |
socket.getLocalAddress().getLocalHost() |
Local port Address 현재 접속된 컴퓨터의 포트번호를 반환 |
socket.getLocalPort() |
[NTP클래스를 가지고 서버와 클라이언트 만들어보기]
1) timeServer
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
|
package site.itwill.net;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//접속 클라이언트에게 서버 컴퓨터의 날짜와 시간정보를 전달하는 서버프로그램
//=>NTP(NetWork Time Protocol) Sever : 날짜와 시간정보를 제공하는 서버 컴퓨터
public class timeServerApp {
public static void main(String[] args) {
ServerSocket ntpServerSocket = null;
try {
//serverSocket인스턴스 생성 - 서버 실행
ntpServerSocket = new ServerSocket(3000);
System.out.println("[message] NTP server Running...");
//서버 프로그램은 클라이언트의 지속적인 접속을 허용하기 위해 무한루프로 처리한다.
while(true) {
//accept() : 클라이언트의 접속을 기다리는 메소드
//클라이언트 접속 전까지 스레드 일시 중지
//=> 클라이언트가 접속될 경우 : 클라이언트의 socket과 연결될 클라이언트 socket인스턴스를 반환
//==> 연결될 소켓 인스턴스를 생성하여 반환 후 스레드 재실행
Socket socket = ntpServerSocket.accept();
/*
//getOutputStream() : 소켓인스턴스의 출력스트림을 반환하는 메소드
OutputStream out = socket.getOutputStream();
//출력스트림을 전달받아 객체 전달이 가능한 출력스트림으로 확장
ObjectOutputStream stream =new ObjectOutputStream(out); //보내려는 데이터가 객체형이기때문
//클라이언트에게 보낼 전달할 날짜와 시간정보를 저장할 date인스턴스 생성
Date date = new Date();
*/
//출력스트림을 이용하여 클라이언트에게 Date인스턴스를 전달
//stream.writeObject(date);
new ObjectOutputStream(socket.getOutputStream()).writeObject(new Date());
//로그
System.out.println("[로그] 클라이언트 " + socket.getInetAddress().getHostAddress()+
"에게 날짜와 시간을 전달하였습니다.");
socket.close();//클라이언트와 연결을 끊는다.
}
} catch (IOException e) {
System.out.println("[error] server에 네트워크 문제발생");
}
}
}
|
cs |
2) timeClient
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
|
package site.itwill.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
//NTP 서버에 접속하여 제공받은 날짜와 시간정보를 읽어들여서 출력하는 클라이언트 프로그램
//=>
public class TimeClientApp {
public static void main(String[] args) throws ClassNotFoundException {
try {
//소켓 인스턴스 생성 - 서버 접속
Socket socket = new Socket("192.168.14.30",3000);
//소켓 인스턴스의 입력스트림을 반환하는 메소드
InputStream in = socket.getInputStream();//소켓한테 인풋스트림 달라고 요청
//입력스트림을 전달받아 객체 읽기가 가능한 입력스트림으로 확장
ObjectInputStream stream = new ObjectInputStream(in);
//서버에서 전달한 Date인스턴스를 반환받아 저장(명시적 형변환 필요)
Date serverDate = (Date) stream.readObject(); //스트림에 읽을 데이터가 없으면 스레드 일시중지되어있음
System.out.println("[결과] 서버에서 제공된 날짜와 시간 = " +
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(serverDate));
socket.close(); //접속종료
} catch (IOException e) {
System.out.println("서버에 접속할 수 없습니다.");
}
}
}
|
cs |
[UDP통신]
- UDP :서버와 클라이언트가 따로 존재하지 않고 데이터를 서로 주고받는다 : p2p서비스
'💻 수업정리 (2020) > 자바' 카테고리의 다른 글
[5/21] 싱글톤 패턴 (0) | 2020.06.27 |
---|---|
[6/11] 소켓통신을 이용한 채팅프로그램 만들어보기 (0) | 2020.06.11 |
[6/9] 파일처리 - 텍스트를 이용하여 파일저장, 출력 응용 (0) | 2020.06.09 |
[6/8] java.io패키지 (0) | 2020.06.08 |
[6/4] 버튼입력받아 계산기 만들기 (0) | 2020.06.04 |