yoni
[29][Network] Network(네트워크), Socket, ServerSocket 본문
java of educational by contents
[29][Network] Network(네트워크), Socket, ServerSocket
yoni-1117 2018. 12. 9. 16:05[01] 네트워크 개론
- 산악 지역등의 데이터 수집
108/서울/86m/○/0/0/0/24.8/291.1/WNW/5.9/326.3/NNW 3.4/27/1006.8/서울특별시 종로구
태양열 전원 공급:
Arduino 센서 데이터 수집
-> Network API
-> Bluetooth로 데이터 수집
-> 3G, LTE(Data 통신)로 전송
-> 위성
-> TCP/IP 통신
-> 네트워크 서버로 데이터 저장
-> DBMS 서버에 저장 -+-> JSP/Spring/MyBATIS등으로 구현 -> Web Server에서 서비스
+-> 빅데이터 분석
Arduino 센서 데이터 수집
-> Network API
-> Bluetooth로 데이터 수집
-> 3G, LTE(Data 통신)로 전송
-> 위성
-> TCP/IP 통신
-> 네트워크 서버로 데이터 저장
-> DBMS 서버에 저장 -+-> JSP/Spring/MyBATIS등으로 구현 -> Web Server에서 서비스
+-> 빅데이터 분석
+-> 머신 러닝 예측
1. IP and Port의 이해
- TCP/IP 프로토콜은 IP와 PORT 정보를 이용하여 사용됩니다.
- 프로토콜은 인간의 언어 처럼 2대 이상의 컴퓨터가 서로 데이터를
주고받는 하드웨어적, 소프트웨어적 규칙(규격)을 말합니다.
- IP(Internet Protocol) 하나당 사용 가능한 포트 : 0 ~ 65535 (2Byte)
- IP는 컴퓨터의 위치 정보를 가지고 있습니다.
- TCP/IP 프로토콜은 IP와 PORT 정보를 이용하여 사용됩니다.
- 프로토콜은 인간의 언어 처럼 2대 이상의 컴퓨터가 서로 데이터를
주고받는 하드웨어적, 소프트웨어적 규칙(규격)을 말합니다.
- IP(Internet Protocol) 하나당 사용 가능한 포트 : 0 ~ 65535 (2Byte)
- IP는 컴퓨터의 위치 정보를 가지고 있습니다.
- 알려진 개발자가 사용할 수 없는 포트(Well known port)
20, 21 : FTP, 파일 전송
22 : Secure Shell 접속, SSH, 서버 콘트롤, 원격 서버 조작.
23 : Telnet, 원격 접속, 서버 콘트롤, 보안성이 없음.
25 : SMTP, 메일 전송
80 : HTTP, Apache, IIS등 웹서버, 인터넷 웹 페이지 서비스
110: POP3 , 메일 수신
110: POP3 , 메일 수신
1433 : MS-SQL DBMS 기본 포트, DBMS
1521 : Oracle DBMS 기본 포트, DBMS
3306 : MySQL DBMS 기본 포트, DBMS
3690 : SVN 소스 동기화 개발 서버
1521 : Oracle DBMS 기본 포트, DBMS
3306 : MySQL DBMS 기본 포트, DBMS
3690 : SVN 소스 동기화 개발 서버
8080 : Apache, 기타 웹 서버, 오라클 DBMS 웹서버
- 1500번 이하는 시스템이 사용하는 포트가 많음으로 1500번 이상 사용을
권장합니다. 10000번 이상 사용하면 충돌이 거의 없음.
2. IP의 확인: ipconfig (linux: ifconfig)
1) IP Address. . . . . : 172.16.7.1
[02] Socket, ServerSocket
- ServerSocket:
클라이언트보다 먼저 실행되어 클라이언트의 접속 요청을 기다리며,
클라이언트가 접속하면 양방향 통신을 할 수 있는 Socket 객체를 생성합니다.
클라이언트보다 먼저 실행되어 클라이언트의 접속 요청을 기다리며,
클라이언트가 접속하면 양방향 통신을 할 수 있는 Socket 객체를 생성합니다.
- Socket: 다른 Socket과 데이터를 직접 송수신 합니다.
- Network 프로그램의 운영순서
ⓐ Server: ServerSocket 생성
ⓑ Server: 포트감시 시작, Client의 접속을 기다림
ⓒ Client: Socket 생성시에 인자 값으로 서버의 IP, PORT를 지정,
서버에 접속 요구
ⓓ Server: Client의 요구를 받아 Socket 객체 생성
ⓔ Server: 생성된 Socket 객체를 이용해 Client에게 데이터를 보냄
Client: Socket객체로 데이터를 받고 필요한 데이터를 다시
서버로 전송함
서버로 전송함
ⓒ
172.16.7.1:2015
ⓐ 서버 ⓑ 접속요청
- ServerSocket --> PORT감시 <--------- Socket Client(PC, 스마트폰등)
│ ↑
│생성 │
↓ │
Socket1 ←───────┘
ⓓ ⓔ 실시간 통신(송수신)
하나의 접속자와 Socket 양방향 연결 후 포트 감시(접속 대기)를 계속 진행합니다.
Client 쪽의 Socket PORT는 사용하지 않는 PORT로 무작위로 발생합니다.
서버는 지정된 동일한 포트 <--- 사용하지 않는 포트 무작위 사용
- Server ---> Socket 1:2015 <--- User1 Socket:3001
Socket 2:2015 <--- User2 Socket:5000
Socket 3:2015 <--- User3 Socket:7800
1. 클라이언트 기준 데이터 흐름도, Handshaking 과정
2. 서버 기본 코드
ServerSocket server = null; // Client의 최초 접속 요청을 받음.
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 IP 정보
.....
socket = server.accept(); // 대기중
3. Client 기본 코드
.....
socket = server.accept(); // 대기중
inet = socket.getInetAddress();
System.out.println("접속된 Client IP: " + inet.getHostAddress());
socket.close();
.....3. Client 기본 코드
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 IP 정보
.....
socket = new Socket(ip, port); // 서버에 연결 요청
.....
socket = new Socket(ip, port); // 서버에 연결 요청
inet = socket.getInetAddress();
System.out.println("접속한 서버 IP: " + inet.getHostAddress());
socket.close();
.....4. 문자열 데이터 송수신 기본 코드
② 입력 코드
① 출력 코드
OutputStream os = null; // 네트워크 전송
OutputStreamWriter osw = null; // 한글 변환 처리
BufferedWriter bw = null; // 메모리에 기록
.....
.....
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
.....
bw.close();
osw.close();
os.close();
② 입력 코드
InputStream is = null; // 네트워크 전송
InputStreamReader isr = null; // 한글 변환 처리
BufferedReader br = null; // 메모리에 기록
.....
.....
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
.....
.....
br.close();
isr.close();
is.close();
* 이클립스에서 네트워크 프로그램은 Command(Prompt, Shell)창에서 백그라운드로
감추어짐으로 실행하면 불편합니다.
* java.net.BindException: Address already in use: JVM_Bind
- 이미 서버가 실행되고 있음.
- 2010 포트를 다른 네트워크 프로그램이 사용하고 있음으로 [작업 관리자]에서
'javaw.exe' 프로세스를 종료하세요.
[실습 1] 서버로부터 문자열을 전달받는 프로그램의 제작
- 실행시 console 창에서 start를 실행하면 경로가 자동으로 이동됩니다.
/ws_java/network/bin>start
1. Server
/ws_java/network/bin>start
1. Server
- 서버에서 전달하는 항목: 추천하는 문자열을 접속자에게 전송합니다.
[맛집]/맛집1/맛집2/맛집3
[영화]/영화1/영화2/영화3
[여행]/여행1/여행2/여행3
예) 맛집, 산, 바다, 계절별, 여행(국내/해외), 영화, 도서, 휴양림, 휴계소등
- 통신중인 컴퓨터는 같은 형식의 데이터를 주고받아야하며
서버에서 전달하는 문자열은 형식을 가지고 있습니다.
예) 형식화된 Text, CSV( 콤마 구분 파일), JSON(문자열 객체),
XML(사용자 정의 태그), 기타 파일
- 서버 실행을 Eclipse에서 진행할시 서버 화면이 감추어지며, 이클립스 종료시
서버가 계속 살아 있을 수 있습니다. 따라서 Eclipse에서는 서버를 실행하지 않습니다.
콘솔에서 실행합니다.
* 방화벽 열기
http://soldeskit3.cafe24.com/pds/read.jsp?pdsgrpno=10&pdsno=1503&col=&word=¤tPage=0&visible=
[실행 화면]
/ws_java/oop/bin>java network.Server1Use 2010
[맛집]/맛집1/맛집2/맛집3
[영화]/영화1/영화2/영화3
[여행]/여행1/여행2/여행3
예) 맛집, 산, 바다, 계절별, 여행(국내/해외), 영화, 도서, 휴양림, 휴계소등
- 통신중인 컴퓨터는 같은 형식의 데이터를 주고받아야하며
서버에서 전달하는 문자열은 형식을 가지고 있습니다.
예) 형식화된 Text, CSV( 콤마 구분 파일), JSON(문자열 객체),
XML(사용자 정의 태그), 기타 파일
- 서버 실행을 Eclipse에서 진행할시 서버 화면이 감추어지며, 이클립스 종료시
서버가 계속 살아 있을 수 있습니다. 따라서 Eclipse에서는 서버를 실행하지 않습니다.
콘솔에서 실행합니다.
* 방화벽 열기
http://soldeskit3.cafe24.com/pds/read.jsp?pdsgrpno=10&pdsno=1503&col=&word=¤tPage=0&visible=
[실행 화면]
/ws_java/oop/bin>java network.Server1Use 2010
접속자를 기다리는 중입니다.
접속된 IP: 172.16.7.1
접속자를 기다리는 중입니다.
접속된 IP: 172.16.7.20
접속자를 기다리는 중입니다.
▷ network.Server1.java
▷ network.Server1.java
--------------------------------------------------------------------
package network;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
public void server(int port) {
ServerSocket server = null; // client의 접속 요청을 처리
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 정보
OutputStream os = null; // 네트워크 전송
OutputStreamWriter osw = null; // 출력시 한글을 코드로 변환 처리
BufferedWriter bw = null; // 출력할 데이터를 메모리에 저장
try {
.....
.....
try { bw.close(); } catch (Exception e) { }
try { osw.close(); } catch (Exception e) { }
try { os.close(); } catch (Exception e) { }
try { socket.close(); } catch (Exception e) { }
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try { server.close(); } catch (Exception e) { }
}
}
}
--------------------------------------------------------------------
▷ network.Server1Use.java
--------------------------------------------------------------------
package network;
public class Server1Use {
public static void main(String[] args) {
Server1 server = new Server1();
int port = Integer.parseInt(args[0]);
server.server(port);
}
}
--------------------------------------------------------------------
2. Client
- StringTokenizer를 이용하여 문자열을 분리
[실행 화면]
/ws_java/oop/bin>java network.Client1Use 172.16.7.100
- StringTokenizer를 이용하여 문자열을 분리
[실행 화면]
/ws_java/oop/bin>java network.Client1Use 172.16.7.100
접속된 Server IP: 172.16.7.100
[영화]
월터의 상상은 현실이된다.
악마는 프라다를 입는다.
이미테이션 게임
맘마미아
맘마미아
▷ network.Client1.java
--------------------------------------------------------------------
--------------------------------------------------------------------
package network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
public class Client1 {
public void client(String ip, int port) {
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 정보
InputStream is = null; // 네트워크 수신
InputStreamReader isr = null; // 수신된 코드를 한글로 변환
BufferedReader br = null; // 메모리에 기록
try {
.....
.....
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try { br.close(); } catch (Exception e) { }
try { isr.close(); } catch (Exception e) { }
try { is.close(); } catch (Exception e) { }
try { socket.close(); } catch (Exception e) { }
}
}
}
--------------------------------------------------------------------
▷ network.Client1Use.java
--------------------------------------------------------------------
--------------------------------------------------------------------
package network;
public class Client1Use {
public static void main(String[] args) {
Client1 client = new Client1();
String ip = args[0]; // ip
int port = 2010;
client.client(ip, port);
}
}
[실습 2] 서버로 문자열을 전달하는 프로그램의 제작
1. Server
/ws_java/oop/bin>java network.Server2Use 2010
접속자를 기다리는 중입니다.
[접속] 172.16.7.1
[여행 추천]
거제도
삼척 36번 국도
미시령 옛길
미시령 옛길
--------------------------
접속자를 기다리는 중입니다.
▷ network.Server2.java (Server1.java 복사)
--------------------------------------------------------------------
try { br.close(); } catch (Exception e) { } --------------------------------------------------------------------
package network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
public class Server2 {
public void server(int port) {
ServerSocket server = null; // client의 접속 요청을 처리
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 정보
InputStream is = null; // 네트워크 수신
InputStreamReader isr = null; // 수신된 코드를 한글로 변환
BufferedReader br = null; // 메모리에 기록
try {
.....
server = new ServerSocket(port);
while(true) {
System.out.println("접속자를 기다리는 중입니다.");
socket = server.accept();
inet = socket.getInetAddress();
System.out.println("접속된 Client IP: " + inet.getHostAddress());
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
.....
try { br.close(); } catch (Exception e) { }
try { isr.close(); } catch (Exception e) { }
try { is.close(); } catch (Exception e) { }
try { socket.close(); } catch (Exception e) { }
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try { server.close(); } catch (Exception e) { }
}
}
}
▷ network.Server2Use.java
--------------------------------------------------------------------
--------------------------------------------------------------------
package network;
public class Server2Use {
public static void main(String[] args) {
Server2 server = new Server2();
int port = Integer.parseInt(args[0]);
server.server(port);
}
}
2. Client
1) 출력 받는 모듈 간략화
[실행 화면]
/ws_java/oop/bin>java network.Client2Use172.16.7.100
[서버 IP] 172.16.7.100
▷ network.Client2.java
--------------------------------------------------------------------
package network;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client2 {
public void client(String ip, int port) {
Socket socket = null; // 데이터 송수신
InetAddress inet = null; // 접속 정보
OutputStream os = null; // 네트워크 전송
OutputStreamWriter osw = null; // 출력시 한글을 코드로 변환 처리
BufferedWriter bw = null; // 출력할 데이터를 메모리에 저장
try {
.....
socket = new Socket(ip, port);
inet = socket.getInetAddress();
System.out.println("접속된 Server IP: " + inet.getHostAddress());
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw); } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try { bw.close(); } catch (Exception e) { }
try { osw.close(); } catch (Exception e) { }
try { os.close(); } catch (Exception e) { }
try { socket.close(); } catch (Exception e) { }
}
}
}
--------------------------------------------------------------------
▷ network.Client2Use.java
--------------------------------------------------------------------
--------------------------------------------------------------------
package network;
public class Client2Use {
public static void main(String[] args) {
Client2 client = new Client2();
String ip = args[0]; // ip
int port = 2010;
client.client(ip, port);
}
}
'java of educational by contents' 카테고리의 다른 글
[31][Network] Thread SYNCHRONIZED 동기화 처리 (0) | 2018.12.09 |
---|---|
[30][Network] Thread의 이용 (0) | 2018.12.09 |
[28][OOP] 접근 한정자(Access Modifier, 제한자), Final 변수 (0) | 2018.12.09 |
[27][OOP] 추상 메소드, 추상 클래스(Abstract Class), 인터페이스(Interface) (0) | 2018.12.09 |
[26][OOP] Static method, Wrapper class(Integer...), Scanner class (0) | 2018.12.08 |
Comments