ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바] Socket 통신
    program_language 및 궁금한것/Java 2019. 5. 9. 16:29

    Socket 통신 - 휴대폰에 비유

    - 서로다른 JVM간의 통신수단

    - 망 ip만 있으면 통신이 가능하다.

    - 스트림을 기반으로 하는 통신

     

    TCP: 연결지향 ex.전화기 / 연결이 된상태에서 데이터를 주고받아 신뢰성이 높다.

    1. 연결방식
        - 연결기반(connection-oriented)
        - 연결 후 통신(전화기)
        - 1:1 통신방식
    2. 특징
        - 데이터의 경계를 구분 안 함.(byte-stream)
        - 신뢰성 있는 데이터 전송
        - 데이터의 전송순서가 보장.
        - 데이터의 수신여부를 확인함(데이터가 손실되면 재전송)
        - 패킷을 관리할 필요가 없음
        - UDP보다 전송속도가 느림
    3. 관련 클래스
        - Socket, ServerSocket(기지국: 항상가동되어야 한다.) 

    TCP소켓프로그래밍

    1. 서버 프로그램: 서버소켓을 사용, 서버 컴퓨터의 특정포트에서 
                           클라이언트의 연결요청을 처리할 준비
    2. 클라이언트 프로그램: 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서
                                    서버에 연결을 요청.
                                  
    3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서
        클라이언트의 소켓과 연결되도록 한다.
        
    4. 클라이언트의 소켓과 서버의 소켓이 일대일 통신.

     

    Socket프로그램

    - Socket은 전화기

    - Server와 Client사이에 통신하려면 Socket을 통해 연결

    --> Server (클라이언트의 연결 대기상태를 표현)     ServerSocket 객체를 가져야 한다.

         ServerSocket ss= new ServerSocket(서비스할 포트넘버);

              --> 만약 '서버소켓' 객체를 실행하는 JVM의 IP가 

         Socket s = ss.accept(); // 클라이언트 접속대기 ( 블로킹상태 )

     

    서버 -> 클라이언트에게 메세지 전달

     

    OutputStream out = s.getOutputStream(); 클라이언트에 메세지 전송

    out.write() // 스트림에 쓰기 작업

     

     

    --> Client

         Socket객체를 생성한다.

         Socket s = new Socket(" HOST 정보 ", 포트넘버) ; // 서버소켓 연결요청! 

         InputStream in= s.getInputStream();// 서버가 전달한 메세지 읽어오기

         in.read(); // 스트림으로부터 읽기 작업

     

         OutputStream out = s.getOutputStream(); 서버에 메세지 전송

         out.write( " 안뇽 ");  // 스트림에 쓰기 작업

    UDP: 비연결지향 ex.우편(수신자, 발신자, 내용) 

    선반위에 올려 놓는다. 쓴다는 개념으로 보면 된다.

    사람1              핸드폰   ----------------------------    핸드폰           사람2

    데이터출력     Soket-->(write("창원"))           Soket-->(read("창원"))    데이터 입력

     

    Soket안에는 getgetOutputStream(), getInputStream() 두개가 존재한다.

     

    순서는 출력이 먼저

    get다음에 들어가는 문자들이 리턴 타입이다.

    RMI (Remote Method Invocation)

    원격지의 메소드를 호출하는 자바 기능이다.

    매개변수를 주고 받는것이 바로 통신이다.

     

    참고.

    - Socket s = new Socket();          
             InputStream  is= s.getInputStream();
             OutputStream os= s.getOutputStream();
             
             is.read();//---> 스트림으로 부터 읽기 작업.
             os.write();//---> 스트림에 쓰기 작업.
             
             
             
             
    ================================================================================
     <클라이언트> JVM 192.168.0.203          <서버>     JVM 192.168.0.96
    - 아이객체(때쟁이객체)                   - 엄마객체  
    - (서비스)요청 객체                                       - (서비스)응답객체 

                                         1. ServerSocket ss = new ServerSocket(3000);
                                                                           //port:0~65535
                                          ---> ip96번 PC에서 소켓서비스를 준비하겠음!!
                                          
                                         2. ss.accept();//클라이언트 접속 대기(블로킹상태)
                                           

    3. Socket s = 
         new Socket("192.168.0.96", 3000);                 Socket s = ss.accept();                      
                            -------------   ----                   --------
                     네트워크상에서 서비스PC찾기  서비스종류                        접속한 클라이언트의 소켓정보 리턴!!

       ==> 접속 요청!!


    4. BufferedReader in                               4. BufferedReader in;
               = new BufferedReader(                      
                 new InputStreamReader(                   OutputStream out;
                 s.getInputStream()));                                     
       ==> in: 서버가 전달한 메시지 읽기                                        ==> in: 클라이언트가 전달한 메시지 읽기
       
       OutputStream out = s.getOutputStream();
       ==> out: 서버에게 메시지 쓰기                                             ==> out: 클라이언트에 메시지 쓰기
       
                                  -------------------------------------------------------------------------------------
                                      공통: 5. 쓰기   6.읽기        7.쓰기    8.읽기      9.쓰기     10.읽기   ........
                                      
                                       
                                            \nolleh|001
    tf값을 [스트림에 쓰기] 5.write  --------------------------->    6. String str = readLine()
    ----                                                                 ----
    "hello"                                                           "100|hello"
    ---> "100|hello"변환 write                                     split후  "100"일때 [메시지]!! 
                                           hello\n
    8. String str =readLine()  <--------------------------    7. write("hello\n".getBytes())
       ta.append(str+"\n")
       
                                                     \n이동길|002
    대화명값을 [스트림에 쓰기] 9.write  --------------------------->  10. String str = readLine()
    ----                                                                 ----
    "길동이"                                                              "200|길동이"    
    ---> "200|길동이"변환 write                                      split후 "200"일때 [대화명]!!
                                                  //  길동이\n
    //12. String str =readLine()  <--------------------------   // 11. write("길동이\n".getBytes())
    //   ta.append(str+"\n")                                    11. String nickName="길동이";

    반응형

    'program_language 및 궁금한것 > Java' 카테고리의 다른 글

    배열검색 - 선형검색  (0) 2019.05.16
    알고리즘  (0) 2019.05.14
    [자바] InetAddress, URL  (0) 2019.05.08
    [자바] 동기화 (Synchronized)  (0) 2019.05.08
    [자바] 스레드 Thread  (0) 2019.05.08

    댓글

Designed by Tistory.