• Java - 네트워크 통신(Socket)

    2021. 2. 28.

    by. 공상개발

    안녕하세요

    공상 개발입니다.

     

    오늘은 Java에서 네트워크 통신(Socket) 대해 알아보는 시간을 가지도록 하겠습니다.

     

     


     

    1. IP 주소와 포트의 관계

    2. 소켓

    3. 클라이언트 Socket 클래스

    4. 서버 Socket 클래스

    5. 채팅 예제

     


     

    # IP 주소와 포트의 관계

     

     

    IP 주소는 네트워크 상의 컴퓨터 또는 시스템을 식별하는 주소입니다.

    포트 번호를 이용하여 통신할 응용 프로그램을 식별할 수 있고, 데이터 교환을 할 수 있습니다.

     

    # 소켓

     

    소켓(socket)은 TCP/IP 네트워크를 이용하여 통신 프로그램을 작성하도록 지원하는 기반 기술입니다.

    소켓은 특정 IP 포트 번호와 결합하고, 소켓이 연결되어야 통신이 가능합니다.

     

    TCP / IP : transmission control protocol / internet protocol

     

    소켓을 이용한 웹 서버와 클라이언트 사이의 통신 사례

     

    서버에 클라이언트가 연결되는 과정입니다.

    1. 서버는 서버 소켓으로 들어오는 연결 요청을 기다림(listen)


    2. 클라이언트가 서버에게 연결 요청


    3. 서버가 연결 요청 수락(accept)

    - 새로운 클라이언트 소켓을 만들어 클라이언트와 통신하게 함

    - 그리고 다시 다른 클라이언트의 연결을 기다림

     

     

    # 클라이언트 Socket 클래스

     

    • Socket 클래스
    • - 소켓 생성 및 연결에 사용되는 클래스
    • - java.net 패키지에 포함
    생성자 설명
    Socket 연결되지 않은 상태의 소켓을 생성.
    Socket(InetAddress address, int port) 소켓을 생성하고, 지정된 IP 주소(address)와 포트 번호(port)에서 대기하는 원결 응용프로그램의 소켓에 연결.
    Socket(String host, int port) 소켓을 생성하여 지정된 호스트(host)와 포트 번호(port)에
    연결한다. 호스트 이름이 null인 경우는 루프백(loopback) 
    주소로 가정.

     

    • Socket 클래스의 메서드
    메소드 설명
    void bind(SocketAddress bindpoint) 소켓에 로컬 ip 주소와 로컬 포트 지정
    void close() 소켓을 닫는다.
    void connect(SocketAddress endpoint) 소켓을 서버에 연결
    InetAddress getInetAddress() 소켓에 연결된 서버 ip 주소 반환
    InputStream getInputStream() 소켓에 연결된 입력 스트림 반환. 이 스트림을 이용하여 소켓이 상대편으로부터 받은 데이터를 읽을 수 있음
    InetAddress getLocalAddress() 소켓이 연결된 로컬 주소 반환
    int getLocalPort() 소켓의 로컬 포트 번호 반환
    int getPort() 소켓에 연결된 서버의 포트 번호 반환
    OutputStream getOutputStream() 소켓에 연결된 출력 스트림 반환. 이 스트림에 출력하면 소켓이 서버로 데이터 전송
    boolean isBound() 소켓이 로컬 주소에 연결되어있으면 true 반환
    boolean isConnected() 소켓이 서버에 연결되어 있으면 true 반환
    boolean isClosed() 소켓이 닫혀있으면 true 반환
    void setSotimeout(int timeout) 데이터 읽기 타임아웃 시간 지정. 0이면 타임아웃 해제

     

    굳이 외울 필요는 없지만 한번 보신다면 아래의 예제 코드를 볼 때 수월합니다.

     

    # 서버 Socket 클래스

     

    • ServerSocket 클래스
    •  - 서버 소켓에 사용되는 클래스, java.net 패키지에 포함
    •  - 생성자
    생성자 설명
    ServerSocket(int port) 지정된 포트 번호(port)와 결합된 소켓 생성

     

    • 메서드
    메소드 설명
    Socket accept() 클라이언트로부터 연결 요청을 기다리다 요청이 들어오면 수락하고 클라이언트와 데이터를 주고받을 새 Socket 객체를
    반환
    void close() 서버 소켓을 닫는다.
    InetAddress getInetAddress() 서바 소켓의 로컬 IP 주소 반환
    int getLocalport() 서버 소켓의 로컬 포트 번호 반환
    boolean isBound() 서버 소켓이 로컬 주소에 연결되어있으면 true 반환
    boolean isClosed() 서버 소켓이 닫혀있으면 true 반환
    void setSotimeout(int time out) accept()가 대기하는 타임아웃 시간 지정. 0이면 무한정 대기

     

    # 채팅 예제

     

    서버 소스

     

    클라이언트 소스

     

     

     정말 기본적인 소켓 프로그래밍 예제 코드입니다.

    코드가 생각보다 그다지 어렵지 않죠? 

    위의 클라이언트 소스와 서버 소스를 비교해보면 크게 차이가 나지 않다고 느껴집니다.

    둘의 차이점은

    서버는 ServerSocket 인스턴스를 생성해서 접속하고, 클라이언트는 Socket 인스턴스를 생성해서 접속합니다.

    그리고 서버는 Socket 인스턴스 접속 후, Socket 인스턴스를 리턴합니다.

     

     

    한번 명령 프롬프트로 실행해 봅시다.

     

     

    명령 프롬프트 창을 켜주신 후, class 파일과 상위 디렉터리를 찾아가 주고 서버를 실행합니다.

     

     

    마찬가지로 명령 프롬프트 창을 하나 더 켠 후, 클라이언트를 실행해 줍니다.

     

    대화를 몇 번 수신하면 아래와 같이 이루어집니다.

     

     


     

    피드백

     

    작성된 내용 중 잘못된 정보나 접근이 있을 시, www.instagram.com/hong_.98/을 통해 말씀해 주시면 감사하겠습니다.

     

    읽어주셔서 감사합니다.

    'Language > Java' 카테고리의 다른 글

    Java - 예외 처리(exception handling)  (0) 2021.02.22

    댓글