소켓(Socket)?
Socket은 응용프로그램에서 TCP/IP를 이용하는 창구 역할을 하며, 두 프로그램이 네트워크를 통해 서로 통신을 수행할 수 있도록 양쪽에서 생성되는 링크의 단자이다.
두 소켓이 연결되면 서로 다른 프로그램이 서로 데이터를 전달할 수 있게 된다.
- 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스 역할을 한다.
- 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어 진다.
- 소켓의 역할에 따라 클라이언트 소켓과 서버 소켓으로 구분된다.
- 소켓은 프로토콜, IP Address, Port Number로 정의된다.
- 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 한다.
소켓 프로그래밍: 나만의 통신구조를 설계하는 것
직접 통신의 근본 과정을 일일이 다 설계하는 것이다.
- 서버와 통신한다고 가정해보자
- 그 서버의 특정 App에 접근하기 위해서는 특정 port와 연결이 되어야 한다.
- 해당 port에 접근한 뒤, 바로 App에 접근하는 것이 아니라, 소켓을 거친후 App에 접근하고 이용한다.
- 우리가 설계하는 소켓 프로그래밍은 이 소켓 부분을 설계에서 어떠한 방식으로 통신할 지 정해주는 것이다.
소켓의 통신 방식
- 통신이 이루어지는 단계
- 기다리는 측을 Server라고 하며, Server에서는 Port를 열고 Client의 접속을 기다린다.
- client class에서 Server의 IP주소와 Port번호를 넣고 출력 스트림으로 넘어간 후, Server Socket에 접근하여 통신이 연결된다.
- Server Socket class는 Client가 접속을 했는지 체크만 하는 용도이다.
- Server class에서 Client 요청 접근이 왔음이 인식이 되면, Server class는 재빨리 Socket.accept() 메소드를 실행한다.
- Server와 Client 간의 통신은 Send, Receive의 형태로 주고받는다.
- 통신이 끝나면 close()로 접속을 끊는다.
- 위와 같이 1:1 통신이 아니라 하나의 서버에 여러 컴퓨터가 접속해오는 경우?
- ServerSocket 하나가 여러 개의 컴퓨터의 client 접속을 인식한다.
- client 1개당 1개의 ServerSocket이 생성된다.
- 예; 컴퓨터 1000대가 접속 → 1000개의 ServerSocket이 만들어지고 이 1000개의 ServerSocket이 accept() 메소드를 호출한다. ⇒ 비효율적
- 이러한 비효율적인 문제를 해결하기 위해 나온 것이 쓰레드(Thread)이다.
소켓 종류
TCP
- 양방향으로 바이트 스트림을 전송, 연결 지향성
- 오류 수정, 전송 처리, 흐름 제어 보장
- 송신된 순서에 따라 중복되지 않게 데이터를 수신 → 오버헤드 발생
- 소량의 데이터보다 대량의 데이터에 적합
UDP
- 비연결형 소켓
- 데이터 크기에 제한이 없음
- 확실하게 전달이 보장되지 않음(데이터가 손실돼도 오류가 발생하지 않음)
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용한다.
HTTP 통신과 Socket 통신의 차이점
단방향 통신인 Http 통신
- Http 통신은 Client의 요청이 있을 때만 Server가 응답하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식이다.
- Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신으로,
반대로 Server가 Client에게 요청을 보낼 수는 없다.
양방향 통신인 Socket 통신
- Server와 Client가 특정 Port를 통해 실시간으로 양방향 통신을 하는 방식이다.
- Http 통신과 다르게 Server와 Client가 Port를 통해 연결되어 있어서 실시간으로 양방향 통신을 할 수 있다.
- Streaming 중계나 실시간 채팅, 게임 등과 같이 즉각적으로 정보를 주고 받는 경우에 사용된다.
Stream은 프로그램 동작 중 외부에서 데이터를 읽거나 외부로 데이터를 출력하는 작업에 사용된다.
프로그램 동작 중, 외부에서 데이터를 읽거나 외부로 데이터를 출력하는 과정에서
데이터는 어떤 통로를 통해 이동되는데, 이때 이 통로를 Stream이라고 한다.
⇒ Stream: 데이터가 읽고 쓰이는 과정에서 데이터가 이동하는 통로
- InputStream: 외부에서 데이터를 읽는 역할을 수행
- OutputStream: 외부로 데이터를 출력하는 역할을 수행
- 위의 두 Stream은 단일 방향으로 연속적으로 흘러간다.
- 단방향이라는 특징 때문에, 하나의 스트림으로 입출력을 동시에 할 수 없어서 InputStream과 OutputStream이 따로 존재한다.
출처
https://mainpower4309.tistory.com/25
https://wildeveloperetrain.tistory.com/122