컴퓨터 관련/JAVA 강의

java #30 Network, Port

승명 2016. 12. 18. 20:47

java #30 Network, Port

 
* network
- 다른 컴퓨터와 연결하기 위한 환경      
- c/s (client/server)환경
- protocal을 사용하여 통신을 하게 된다.
- java.net package에 구현(TCP : ServerSocket, UDP:DatagramSocket)클래스가 존재

1. 중앙집중식
2. c/s : 배포문제 ex)천리안, 하이텔, 유니텔
3. internet : 웹클라이언트 (접근성 향상)
4. RIA(Rich Internet Application)
- AJAX(Asynchronous Javascript & XML)

TCP(Transmission Control Protocal)

UDP(User Datagram Protocal)

- 전화
- 속도 느림(데이터 확인)
- 안정성 좋음
- 중요정보전송시
- 전송크기가 고정되어 있다.(1packet(8bit))
- 우편
- 속도 빠름(데이터 확인 x)
- 안정성 떨어짐, 데이터 유실 우려
- 덜 중요한 정보 전송시(화상채팅, 게임)
- 전송크기가 고정되어있지 않다.(개발자가 packet의 크기를 설정할 수 있다.)
          
* port 
- 문(0~65535개) 
- 1024번 이하는 예약된 port가 많으므로 가급적이면 1024~65535 사이의 포트를 열어라. 선점하는 프로그램이 사용.

1서버생성하여 port 연다
1
ServerSocket s = new ServerSocket(3000);
cs
2클라이언트서버의 ip주소, port
- 생성과 동시에 임의의 port를 열고 지정된 ip의 서버로 연결 시도
1
Socket client = new Socket("211.63.89.19".3000);
cs
3서버접속자소켓을 받는다
1
Socket s1 = s.accept();
cs
4 | 5서버접속자 소켓에서 Stream얻기
1
2
3
4
DataOutputStream dos = new DataOutputStream(s1.getOutputStream)); 
// 8비트, 한글불가
dos.writeUTF(문자열);//스트림얻기
dos.flush;//스트림 내용 불출 
cs
5 | 4클라이언트
1
2
DataInputStream dis = new DataInputStream(client.getInputStream());
dis.readUTF();
cs

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
package day0311;
 
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
* 접속자 컴퓨터(client)의 임의의 포트를 열어서 서버에 연결하는 Socket을 사용하는 클래스(TCP/IP)
*/
public class SimpleClient {
     public SimpleClient(){
          //1. 소켓을 생성하여 서버에 연결시도
          try {
               Socket client = new Socket("192.168.0.40",65000);
               System.out.println("접속자 생성 서버 접속시도");
               //소켓에서 서버의 데이터를 읽기 위한 스트림을 얻는다.
              
               DataInputStream dis = new DataInputStream(client.getInputStream());
               //접속자의 메세지 읽기
               System.out.println("서버의 메세지 : "+dis.readUTF());
              
          } catch (UnknownHostException e) {
                e.printStackTrace();
          } catch (IOException e) {
                 e.printStackTrace();
          }
     }//SimpleClient
    
public static void main(String[] args){
     new SimpleClient();
}//main
}//class
cs
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
package day0311;
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
* PORT를 열어서 접속자 Socket을 받아서 연결을 유지하는 ServerSocket의 사용(TCP/IP)
*/
public class SimpleServer {
     public SimpleServer() {
 
          // 1. port를 연다
          ServerSocket server;
          try {
               server = new ServerSocket(65000);
               System.out.println("서버 가동중");
               // 2. 접속자 소켓을 받는다.
               String msg = "안녕히가십시오.";
              
               while (true) {
 
                    Socket client = server.accept();
                    System.out.println("접속자 있음: " + client.getInetAddress());
                    //접속자의 소켓에서 메세지를 보내기 위한 출력스트림 얻기
                    DataOutputStream dos=new DataOutputStream(client.getOutputStream());
                    //서버의 메세지는 접속자 스트림에 쓴다.
                    dos.writeUTF(msg);
                    //스트림의 내용을 접속자 소켓에 분출한다.
                    dos.flush();
                   
               }//end while
          } catch (IOException e) {
                e.printStackTrace();
          }
     }
     public static void main(String[] args) {
          new SimpleServer();
       }
}
 
cs