[F-Lab 모각코 챌린지] 10일차(2) - Socket 프로그래밍
F-Lab 모각코 챌린지 10 일차 step 2 입니다 네트워크 프로그래밍에 대해 학습 한 내용을 정리하였습니다. 주로 TCP 통신과 UDP 통신의 클래스와 사용방법, 기본 개념들을 소개하고 있습니다
![[F-Lab 모각코 챌린지] 10일차(2) - Socket 프로그래밍](/content/images/size/w1200/2023/06/-------_--------_-------4.png)
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) |
주어진 바이트 배열, 오프셋, 길이, 목적지 주소 및 포트로 데이터그램 패킷을 생성 |