[F-Lab 모각코 챌린지] 10일차(2) - Socket 프로그래밍

F-Lab 모각코 챌린지 10 일차 step 2 입니다 네트워크 프로그래밍에 대해 학습 한 내용을 정리하였습니다. 주로 TCP 통신과 UDP 통신의 클래스와 사용방법, 기본 개념들을 소개하고 있습니다

[F-Lab 모각코 챌린지] 10일차(2) - Socket 프로그래밍

Network programming

TCP 통신

OSI 7 계층

계층 설명
응용 계층 최종 사용자 응용 프로그램을 위한 고수준 API, 프로토콜, 서비스
표현 계층 응용 계층의 데이터 표현과 암호화/복호화
세션 계층 통신 세션의 설정, 관리, 종료
전송 계층 종단 간 데이터 전송 및 오류 복구
네트워크 계층 라우팅, 주소 할당, 논리적인 네트워크 구성
데이터 링크 계층 인접한 노드간의 신뢰성 있는 데이터 프레임 전송
물리 계층 데이터 전송을 위한 물리적인 매체와 전기/광 신호 송수신

자바의 spring 에서는 응용계층, 표현계층, 세션계층에 대한 처리를 진행함

네트워크 통신을 위해 TCP/IP & UDP 프로토콜을 사용함

소켓(Socket)

  • 네트워크 상에서 데이터를 주고받기 위한 인터페이스
  • 클라이언트와 서버의 양방향 통신을 제공
  • 소켓은 특정 프로토콜을 사용하여 데이터를 패킷 단위로 송신, 수신 함

패킷(Packet)

  • 데이터를 전송하는 단위
    네트워크 통신에서는 일반적으로 데이터를 작은 조각으로 나누어 전송하며 이를 패킷이라고 함
  • 패킷은 헤더 와 페이로드 로 구성되어있음
    헤더: 패킷의 제어 정보, 목적지 주소, 출발지 주소, 패킷 순서 등 메타 데이터 포함됨
    페이로드: 실제 데이터의 전체 혹은 일부

class Socket

TCP 통신은 Socket 클래스를 통해 수행 할 수 있음

Socket 클래스의 하위 구현체

  • ServerSocket:
    서버에서 클라이언트의 연결을 수락하는 데 사용되는 소켓 클래스
    특정 포트에서 대기하며 클라이언트의 요청을 수락하여 Socket 객체를 반환
  • SocketImpl:
    Socket 클래스의 기본 구현체인 추상 클래스
    구체적인 하위 클래스들을 사용하여 소켓의 동작을 확장하고 커스터마이징 가능
  • SocketInputStream & SocketOutputStream:
    Socket 객체와 연결된 입력 스트림과 출력 스트림을 제공하는 클래스
    InputStream 및 OutputStream 의 하위 클래스 이다
  • SocketChannel:
    NIO 패키지에서 제공되는 소켓 채널 클래스
    Blocking, Non-Blocking 모드로 작동 할 수 있으며 NIO 의 기능을 활용, 효율적인 IO 작업을 수행 할 수 있음

ServerSocket

생성자 설명
ServerSocket(int port) 지정된 포트 번호에 바인딩된 ServerSocket 인스턴스를 생성함. 이 때 backlog 의 기본값은 50
ServerSocket(int port, int backlog) 지정된 포트 번호와 백로그 큐의 크기로 ServerSocket 인스턴스를 생성
ServerSocket(int port, int backlog, InetAddress bindAddr) 지정된 포트 번호, 백로그 큐의 크기, 바인딩 주소로 ServerSocket 인스턴스를 생성
  • backlog: 큐의 갯수
    Socket 객체가 다른 요청을 처리하느라 새로 들어온 요청을 처리하지 못하고 있는 경우가 있다. 이 때 최대 대기 수
  • ServerSocket 생성자는 별도로 연결 작업을 해야만 대기가 가능함
    accept(): 객체 생성 후 사용자의 요청을 대기하는 메소드
    close(): 소켓 연결이 끝난 이후 소켓을 닫는 메소드. close 를 호출하지 않고 애플리케이션을 종료 할 경우 해당 포트는 다른 서버나 프로그램이 사용할 수 없음

Socket

  • 서버에서는 클라이언트에서 접속을 하면 Socket 객체를 생성하나, 클라이언트에서는 Socket 객체를 직접 생성 해야만 함

UDP 통신

UDP 통신을 사용 할 때에는 스트림을 사용하지 않고 DatagramPacket 이라는 클래스를 사용함

DatagramSocket

생성자 설명
DatagramSocket() 기본 포트와 바인딩되어 있는 DatagramSocket 인스턴스를 생성
DatagramSocket(int port) 지정된 포트 번호로 DatagramSocket 인스턴스를 생성
DatagramSocket(int port, InetAddress address) 지정된 포트 번호와 로컬 IP 주소로 DatagramSocket 인스턴스를 생성
DatagramSocket(SocketAddress bindaddr) 지정된 주소로 DatagramSocket 인스턴스를 생성
DatagramSocket(SocketAddress bindaddr, DatagramSocketImpl impl) 지정된 주소와 사용자 정의 DatagramSocketImpl 구현체로 DatagramSocket 인스턴스를 생성

데이터를 받기 위해 대기하는 메서드와 데이터를 보내는 메서드가 존재하며 이 역시 Socket 과 마찬가지로 close() 메서드를 호출해야 함

함수 설명
receive() 소켓을 통해 데이터그램을 수신하고 수신된 데이터그램을 receivePacket에 저장
send() 소켓을 통해 데이터그램을 전송. sendPacket에 저장된 데이터를 목적지로 전송

DatagramPacket

네트워크에서 말하는 패킷과 같은 의미

  • buf: 패킷의 데이터를 저장하는 바이트 배열
  • length: 패킷의 길이를 나타내는 정수값
  • address: 목적지 주소로 사용할 InetAddress 객체
  • port: 목적지 포트 번호
  • offset: 패킷 데이터의 시작 오프셋을 나타내는 정수값
생성자 설명
DatagramPacket(byte[] buf, int length) 주어진 바이트 배열로부터 데이터그램 패킷을 생성
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 주어진 바이트 배열, 목적지 주소 및 포트로 데이터그램 패킷을 생성
DatagramPacket(byte[] buf, int offset, int length) 주어진 바이트 배열의 지정된 오프셋부터 지정된 길이만큼 데이터그램 패킷을 생성
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 주어진 바이트 배열, 오프셋, 길이, 목적지 주소 및 포트로 데이터그램 패킷을 생성