본문 바로가기
Back-end

2023.08.22 TIL

by 신재권 2023. 8. 22.

네트워크 프로그래밍

사용자들이 바로 옆에 있는 장비와 데이터를 주고 받는 작업을 네트워킹 이라한다.

네트워킹인 레이어로 구분되어 있다.

애플리케이션 레이어 → 트랜스포트 레이어 → 인터넷 레이어 → 네트워크 인터페이스 레이어

애플리케이션 레이어 중 가장 대표적인 HTTP, FTP, Telnet들은 모두 TCP 통신을 한다.

자바에서 TCP 통신을 한다면, 자바에서 제공하는 API를 사용하면 된다.

애플리케이션 레이어에서 프로그래밍만 하면 트랜스포트 레이어에서의 처리는 자바에서 다 알아서 처리해준다.

TCP, UDP

TCP 통신은 연결 기반 프로토콜 이라 부른다.

TCP는 데이터를 보내면 성공 여부를 알려준다. 즉, 상대방이 데이터를 받았는지 확실히 보장한다.

UDP는 TCP와 다르게 성공 여부를 알지 못해, 데이터를 확실히 받았는지 보장하지 못한다.

TCP는 UDP보다 비싸고 느리며 무겁다.

Socket

자바에서 TCP 통신을 수행하려면, Socket 클래스를 사용하면 된다.

Socket 클래스는 데이터를 보내는 쪽(클라이언트)에서 객체를 생성하여 사용한다. 데이터를 받는 쪽(보통 서버)에서 클라이언트 요청을 받으면, 요청에 대한 Socket 객체를 생성하여 데이터를 처리한다.

즉, Socket 클래스는 서버든, 클라이언트든 원격에 있는 장비와의 연결 상태를 보관하고 있다.

서버에는 ServerSocket 클래스를 사용하여 데이터를 받는다.

ServerSocket 클래스에서 제공하는 메서드에서 클라이언트 요청이 생기면 Socket 객체를 생성해 전달해준다.

  • ServerSocket() : 서버 소켓 객체만 생성한다.
  • ServerSocket(int port) : 지정된 포트를 사용하는 서버 소켓을 생성한다.
  • ServerSocket(int port, int backlog) : 지정한 포트와 backlog 개수를 가지는 소켓을 생성한다.
  • ServerSocket(int port, int backlog, InetAddress bindAddr) : 지정된 포트와 backlog 개수를 가지는 소켓을 생성하며, bindAddr에 있는 주소에서의 접근만을 허용한다.

backlog는 ServerSocket 객체가 바빠서 연결 요청을 처리 못하고 대기시킬 때의 최대 대기 개수이다.

backlog를 지정하지 않으면 기본값은 50개이다.

매개변수가 없는 ServerSocket 생성자를 제외한 나머지 클래스들은 객체가 생성되자마자 연결을 대기할 수 있는 상태가 된다.

매개변수가 없는 ServerSocket 생성자는 별도의 연결 작업을 해야 대기가 가능하다.

  • Socket accept() : 새로운 소켓 연결을 기다리고, 연결이 되면 Socket 객체를 리턴
  • void close() : 소켓 연결을 종료

close() 메서드 처리를 하지 않고, JVM이 계속 동장중이면, 해당 포트는 동작하는 서버나 PC에서 다른 프로그램이 사용할 수 없다.

데이터를 받는 서버에서는 클라이언트에서 접속을 하면 Socket 객체를 생성하지만, 데이터를 보내는 클라이언트에서는 Socket 객체를 직접 생성해야만 한다.

  • Socket() : 소켓 객체만 생성
  • Socket(Proxy proxy) : 프록시 관련 설정과 함께 소켓 객체만 생성
  • Socket(SocketImpl impl) : 사용자가 지정한 SocketImpl 객체만을 사용하여 소켓 객체만 생성
  • Socket(InetAddress address, int port) : 소켓 객체 생성 후 address와 port를 사용하는 서버에 연결
  • Socket(InetAddress address, int port, InetAddress localAddr, int localPort) : 소켓 객체 생성 후 address와 port를 사용하는 서버에 연결 하며, 지정한 localAddr와 localPort에 접속
  • Socket(String host, int port) : 소켓 객체 생성 후 host와 port를 사용하는 서버에 연결
  • Socket(String host, int port, InetAddress localAddr, int localPort) : 소켓 객체 생성 후 host와 port를 사용하는 서버에 연결하며, 지정된 localAddr와 localPort에 접속

위의 3개의 생성자를 제외한, 나머지 생성자들은 모두 객체 생성과 함께 지정된 서버에 접속을 한다.

UDP 통신, Datagram 관련 클래스

UDP는 TCP와 다르게 클래스 하나에서 보내는 역할과 받는 역할을 모두 수행할 수 있다. DatagramSocket 클래스를 사용하면 된다.

TCP에서는 스트림 객체를 얻어 데이터를 주거나 받았지만, UDP 통신 시에는 스트림을 사용하지 않고 DatagramPacket 이라는 클래스를 사용한다.

  • DatagramSocket() : 소켓 객체 생성 후 사용 가능한 포트로 대기
  • DatagramSocket(DatagramSocketImpl impl) : 사용자가 지정한 SocketImpl 객체를 사용하여 소켓 객체만 생성
  • DatagramSocket(int port) : 소켓 객체 생성 후 지정된 port로 대기
  • DatagramSocket(int port, InetAddress address) : 소켓 객체 생성 후 address와 port를 사용하는 서버에 연결
  • DatagramSocket(SocketAddress address) : 소켓 객체 생성 후 address에 지정된 서버로 연결
  • void receive(DatagramPacket packet) : 메서드 호출 시 요청을 대기하고, 만약 데이터를 받았을 때는 packet 객체에 데이터를 저장
  • void send(DatagramPacket packet) : packet 객체에 있는 데이터 전송
  • DatagramPacket(byte[] buf, int length) : length의 크기를 갖는 데이터를 ‘받기’ 위한 객체 생성
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port) : 지정된 address와 port로 데이터를 전송하기 위한 객체 생성
  • DatagramPacket(byte[] buf, int offset, int length) : 버퍼의 offset이 할당되어 있는 데이터를 전송하기 위한 객체 생성
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) : 버퍼의 offset이 할당되어 있고, 지정된 address와 port로 데이터를 전송하기 위한 객체 생성
  • DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) : 버퍼의 offset이 할당되어 있고, 지정된 소켓 address로 데이터를 전송하기 위한 객체 생성
  • DatagramPacket(byte[] buf, int length, SocketAddress address) : 지정된 소켓 address로 데이터를 전송하기 위한 객체 생성
  • byte[] getData() : 전송 받은 데이터 리턴
  • int getLength() : 전송 받은 데이터의 길이 리턴

byte[] 배열은 전송되는 데이터이고, offset은 전송되는 byte 배열의 첫 위치이다.

length는 데이터의 크기인데, byte 배열의 길이보다 작으면 IllegalArgumentException 가 발생한다.

'Back-end' 카테고리의 다른 글

Thread(Java/OS)  (0) 2023.08.23
동기식 vs 비동기식, Blocking vs Non-Blocking  (0) 2023.08.23
SOLID 원칙, 객체지향 프로그래밍  (0) 2023.08.22
2023.08.21 TIL  (0) 2023.08.21
2023.08.20 TIL  (0) 2023.08.21