목차
Socket 이란?
💡 학습 목표
1.소켓(Socket)이란?
2.소켓의 종류
3.소켓의 동작 방식
4.자바에서의 소켓 프로그래밍
5.소켓 프로그래밍의 응용
소켓은 컴퓨터 네트워킹에서 매우 중요한 역할을 하며, 특히 자바 I/O에서 자주 사용된다.
1. 소켓(Socket)이란?
- 소켓은 네트워크 상에서 통신을 가능하게 하는 끝점을 의미한다. 두 컴퓨터 간의 데이터를 주고받기 위해 사용되는 인터페이스로, 소켓을 통해 네트워크 연결을 설정하고 데이터를 송수신할 수 있다. 쉽게 말해, 소켓은 네트워크를 통해 다른 컴퓨터와 대화하는 전화기 같은 역할을 한다. (소켓은 사실 파일 개념과 같다)
- 소켓은 물리적인 장치가 아니라 추상적인 개념의 약속이다. 네트워크 통신을 위해 소프트웨어적으로 정의된 인터페이스로, 컴퓨터 간의 데이터 교환을 가능하게 하는 규칙과 방법을 의미한다. 이를 통해 네트워크 애플리케이션이 서로 통신할 수 있다.
💡 일반 사용자 컴퓨터에서 네트워크 통신에 사용되는 주요 물리적 장치는 네트워크 인터페이스 카드(NIC), 모뎀, 라우터, 스위치, 액세스 포인트, 그리고 이더넷 케이블입니다. 이 장치들은 함께 작동하여 인터넷과의 연결을 설정하고, 데이터 통신을 가능하게 합니다.
네트워크 인터페이스 카드(NIC) / 랜카드(LAN Card)
• 역할 : 컴퓨터를 네트워크에 연결하는 장치입니다.
• 유형 :
• 유선 NIC(이더넷 카드) : 이더넷 케이블을 통해 네트워크에 연결합니다.
• 무선 NIC(와이파이 카드) : 무선 신호를 통해 네트워크에 연결합니다.
2. 소켓의 종류
- 스트림 소켓(Stream Socket) : TCP(Transmission Control Protocol) 기반의 소켓으로, 연결 지향적이다. 데이터를 안정적으로, 순서대로, 에러 없이 전달할 수 있다. 예를 들어, 웹 브라우저와 웹 서버 간의 통신은 주로 스트림 소켓을 사용한다.
- 데이터그램 소켓(Datagram Socket) : UDP(User Datagram Protocol) 기반의 소켓으로, 비연결 지향적이다. 데이터를 빠르게 전송할 수 있지만, 데이터의 순서나 신뢰성은 보장되지 않는다. 실시간 게임이나 스트리밍에 자주 사용된다.
3. 소켓의 동작 방식
- 서버 측:
- 소켓을 생성하고 포트 번호와 결합(Binding).
- 클라이언트의 연결 요청을 대기(Listening).
- 클라이언트의 연결 요청을 수락(Accept)하고 통신할 준비.
- 클라이언트 측:
- 소켓을 생성하고 서버의 주소와 포트 번호로 연결(Connection)을 요청.
- 서버와 연결이 성공하면 데이터를 송수신할 수 있다.
4. 자바에서의 소켓 프로그래밍
서버측 기본 코드
package ch01;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
// 서버측 소켓통신을 만들기 위해서 준비물
// 1. ServerSocket (클라이언트 측 소켓과 연결만 시켜준다)
// 2. 클라이언트와 연결 되는 소켓을 들고 있어야 한다.
// 로컬 컴퓨터에는 정해진, 사용할 수 있는 포트 번호 개수가
// 할당 되어 있다. 1 ~ 1024 포트 번호는 잘 알려진 포트 번호
// 시스템이 선점하고 있는 번호들이다.
try (ServerSocket serverSocket = new ServerSocket(5000)) {
System.out.println("서버 포트 번호 : 5000으로 생성");
// 내부 메서드 안에서 while 문을 돌면서 클라이언트 측에
// 연결을 기다리고 있습니다.
Socket socket = serverSocket.accept();
// 여기 아래는 클라이언트 측과 양 끝단의 소켓이 서로
// 연결 되어야 실행 흐름이 내려온다.
System.out.println("Client connected....");
// 대상 - 소켓 --> 입력 스트림을 가져 온다.
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String message = reader.readLine(); // 한 줄 단위로 데이터를 읽어라 (문자기반)
System.out.println("Received : " + message);
// 기본 소켓은 클라이언트가 연결 되어야 생성된다.
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
클라이언트 측 기본 코드
package ch01;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
// 클라이언트 측 -- 소켓 통신을 하기 위해서 준비물
// 1. 서버 측 컴퓨터의 주소 : 포트번호
// 2. 서버측과 연결 될 기본 소켓이 필요하다.
// 생성자 매개변수에 서버측 (IP주소, 포트번호)
// 127.0.0.1 <- 자기 자신의 주소
try (Socket socket = new Socket("localhost", 5000)) {
// new Socket("localhost", 5000) -> 객체 생성 시 서버측과 연결되어서
// 스트림을 활용 할 수 있다.
// 대상은 소켓이다. !!!
OutputStream output = socket.getOutputStream(); // 소켓에서 기반 스트림
PrintWriter writer = new PrintWriter(output, true); // 기능 확장 - 보조 스트림
writer.println("Hello, server");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 소켓 프로그래밍의 응용
- 웹 서버와 클라이언트 간 통신
- 파일 전송
- 채팅 애플리케이션
- 멀티플레이어 게임
'Java > Java 유용한 클래스' 카테고리의 다른 글
1:1 단방향 통신 (클라이언트측) - 22 (0) | 2024.05.23 |
---|---|
1:1 단방향 통신 (서버측) - 21 (0) | 2024.05.23 |
고수준 스트림(Data/Object Stream) - 19 (0) | 2024.05.22 |
사용자모드와 커널모드란? - 18 (0) | 2024.05.22 |
로그와 파일 저장 - 17 (0) | 2024.05.21 |