[Java] 자바 네트워크 TCP 통신 소켓프로그래밍

     TCP 통신방식이란? 

    1. TCP란 소켓 프로그래밍 중의 하나로 스트림 통신 프로토콜이라고 부르며, 양쪽의 소켓이 연결된상태여야만 가능 하기 때문에 연결지향 프로토콜이라고도 합니다. 

    2. TCP 프로토콜은 신뢰성 있는 프로토콜이기 때문에, 송신한 쪽의 데이터가 수신 측에 차례대로, 중간에 유실되는 일 없이 도착 하는 것을 의미합니다. 그러려면 수신 측과 송신 측이 미리 연결을 맺고 연결된 순서대로 데이터를 교환해야 합니다.

    3. 연결지향 방식은, 한번 연결되면 연결이 끊어질 때까지는 송신한 데이터가 차례대로 목적지의 소켓에 전달되는 신뢰성 있는 통신이 가능합니다. 

    4. 이렇게 신뢰성 있는 TCP 연결을 하기 위해서는 TCP 프로그래밍에서 사용하는 라이브러리의 사용 방법과 동작 순서를 정확하게 숙지, 이해하고 있어야 합니다. 

    5. 자바는 TCP 프로그래밍을 쉽게 할 수 있도록 java.net 패키지에 관련 클래스들을 미리 준비해놓고 있기 때문에, 해당 패키지의 클래스들을 알맞게 사용할 수 있어야 합니다.


     소켓이란? 

    1. 자바 프로그램은 소켓(Socket)이라는 개념을 통해서 네트워크 통신을 합니다.

    2. 소켓은 네트워크 부분의 끝 부분을 나타내며, 실제 데이터가 어떻게 전송되는지 상관하지 않고 읽기/쓰기 인터페이스를 제공합니다.

    3. 네트워크 계층과 전송 계층이 캡슐화 되어 있기 때문에 두 개의 계층을 신경 쓰지 않고 프로그램을 만들 수 있습니다.

    4. 소켓은 캘리포니아 대학교에서 빌 조이(Bill Joy)에 의해 개발되었다. 

    5. 자바는 이식성과 크로스 플랫폼 네트워크 프로그램을 위해서 소켓을 핵심 라이브러리 만들습니다.

    6. TCP/IP 계층의 TCP를 지원하기 위해서 Socket, ServerSocket 클래스를 제공하고 있습니다.

    7. 클라이언트는  Socket 객체를 생성하여 TCP 서버와 연결을 시도합니다.

    8. 서버는 SocketServer 객체를 생성하여 TCP 연결을 청취하여 클라이언트와 서버가 연결됩니다..  



     Socket Stream 

    TCP 소켓은 java.net.Socket 클래스를 의미한다. 

    TCP


    Socket 클래스 생성자 

    소켓생성자

    Socket 생성자는 두 가지 예외 처리가 발생합니다.

    1. 호스트를 찾을 수 없거나, 서버의 포트가 열려 있지 않은 경우 UnknownHostException 예외가 발생합니다.

    2. 네트워크의 실패, 방화벽 때문에 서버에 접근 할 수 없을 때 IOException 예외가 발생합니다.


    Socket 클래스의 주요 메서드 

    소켓메서드


    소켓을 이용한 입출력 스트림 생성 

    1. TCP 소켓은 두 개의 네트워크 사이에서 바이트 스트림 통신을 제공합니다.

    2. Socket 클래스는 바이트를 읽기 위한 메서드와 쓰기 위한 메서드를 제공합니다. 

    3. 두 가지 메서드를 이용하여 클라이언트와 서버간에 통신을 할 수 있습니다.

    java.io.InputStream getInputStream() throws IOException; 
    java.io.OutputStream getOutputStream() throws IOException;
    
    Socket socket = new Socket(“211.238.132.50”,4000); 
    InputStream in = socket.getIputStream(); 
    OutputStream os = socket.getOutputStream();


    소켓정보

    Socket 클래스는 로컬의 IP 주소와 포트를 알 수 있는 메서드와 Socket 으로 연결된 호스트의 IP 주소

    와 포트를 알 수 있는 메서드를 제공합니다.


    소켓정보를 알수있는 메서드

    원격 호스트의 IP 주소를 알 수 있는 메서드

    public InetAddress getInetAddres() throws IOException; 


     원격 호스트의 PORT 번호를 알 수 있는 메서드

    public int getPort() throws IOException; 


    로컬 IP 주소를 알 수 있는 메서드

    public InetAddress getLocalAddres() throws IOException;


    로컬 PORT 번호를 알 수 있는 메서드

    public int getLocalPort() throws IOException; 


    소켓종료 

    1. 소켓의 사용이 끝나면 연결을 끊기 위해서는 소켓의 close() 메서드를 호출해야 합니다.

    2. 소켓 종료는 일반적으로 finally 블록에서 처리하고, close() 메서는 IOException를 발생하기 때문에 예외처리를 반드시 해야 합니다.

    3. 소켓은 시스템에 의해 자동으로 종료되는 경우가 있습니다. 

    4. 프로그램이 종료되거나, 가비지 컬렉터에 의해 처리되는 경우에 소켓이 자동으로 종료됩니다. 

    5. 소켓이 시스템에 의해 자동으로 닫히는 것은 바람직 하지 않고, close() 메서드를 호출해서 정확히 소켓종료를 해야 합니다.

    6. 소켓이 닫히더라도 getIntAddress() , getPort() 메서드는 사용할 수 있으나, getInputStream(), getOutputStream() 메서드는 사용할 수 없습니다.

     


     TCP Server Socket 

    1. ServerSocket 클래스가 TCP 서버 소켓을 의미합니다. 

    2. 클라이언트의 TCP 연결을 받기 위해서는 java.net.ServerSocket 클래스의 객체를 생성해야 합니다.

    3. ServerSocket 클래스는 네트워크 통신을 수행하기 위해 자신을 바로 사용하는 것이 아니라 클라이언트의 TCP 요청에 대한 Socket 객체를 생성하는 역할을 합니다.

    4. ServerSocket 객체를 생성했다면 ServerSocket 클래스의 accept() 메서드는 클라이언트의 TCP 요청이 있을 때 까지 블로킹 되는 메서드입니다.

    5. 클라이언트의 TCP 요청이 오면 accept() 메서드는 클라이언트와 통신할 수 있는 TCP 소켓을 반환합니다.

    6. 그런 후에 다른 클라이언트의 요청을 기다리게 되므로 일반적으로 accept() 메서드는 무한루프로 처리하게 됩니다. 

    7. 클라이언트의 소켓과 서버에서는 accept() 메서드에 의해 반환 소켓을 가지고 스트림을 생성하여 통신하게  됩니다. 

     

    ServerSocket 클래스의 생성자 

    서버 소켓 생성자는 TCP 포트번호를 매개변수로 받습니다.

    만약, 기존의 TCP 포트번호가 사용중이라면 IOException을 발생하게 됩니다. 

    서버소켓클래스


    ServerSocket 클래스의 주요 메서드 

    ServerSocket 클래스의 가장 중요한 메서드는 accept() 메서드이며, accept() 메서드의 시간 설정을 할 수 있는 메서드,ServerSocket를 종료할 수 있는 메서드를 제공하고 있습니다.

    서버소켓클래스메서드


    ServerSocket 연결받기 

    서버 소켓의 주요 작업은 들어오는 연결 요청들을 수신하고 각 요청으로 부터 Socket 객체를 생성하는 것입니다. 이런 역할을 수행하는 것이 ServerSocket 클래스의 accept() 메서드이죠. 클라이언트에 들어오는 요청이 없다면 요청이 올 때까지 accept() 메서드는 블럭화 되거나 타임아웃이 되면 종료됩니다.

    Socket accept() throws IOException,SecurityException; 
    1. accpet() 메서드는 일반적으로 무한루프로 처리합니다.
    2. 클라이언트의 TCP 요청이 오면 accept() 메서드를 통해 Socket 객체를 생성한 후에 다른 클라이언트의 TCP 요청을 기다리게 되므로 accept() 메서드를 무한루프로 처리해야 합니다.

    ServerSocket 정보를 알수있는 메서드
    서버의 포트를 알 수 있는 메서드를 제공하는 메서드
    public int getLocalPort();
    accept() 메서드의 시간을 설정할 수 있는 메서드
    public void setSoTimeout(int timeout) throws SocketException; 
    accept() 메서드의 시간을 알 수 있는 메서드
    만약 0을 반환한다면 accept() 메서드의 유효시간은 무한대를 의미합니다.
    public int getSoTimeout() throws IOException; 

    ServerSocket 종료 
    Socket 클래스의 종료처럼 서버 소켓의 종료는 close() 메서드로 간단하게 종료할 수 있습니다.
    public void close() throws IOException;


    Socket과 ServerSocket을 이용한 간단한 에코 프로그램 

    서버클라이언트


    댓글(2)

    • 2019.02.22 08:33 신고

      안녕하세요 , 저도 통신쪽 공부하고 있는데 작성하신 글을 참고하고 인용하여 제 블로그에 올릴 생각입니다.
      당연히 출처는 남기고 작성하겠습니다.
      실례가 안된다면 그렇게 해도 될까요?

    Designed by JB FACTORY