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에서 서비스
                                 +-> 빅데이터 분석
                                 +-> 머신 러닝 예측   
   
1. IP and Port의 이해
   - 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 , 메일 수신 
     1433 : MS-SQL DBMS 기본 포트, DBMS
     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과 데이터를 직접 송수신 합니다.
 
   - 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(); // 대기중


        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); // 서버에 연결 요청


        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
   - 서버에서 전달하는 항목: 추천하는 문자열을 접속자에게 전송합니다.
     [맛집]/맛집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
--------------------------------------------------------------------
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
 
접속된 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 복사)
--------------------------------------------------------------------
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);
 
  }
 
}
 
 
 
 
--------------------------------------------------------------------


Comments