햄발
Socket 본문
소켓(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. 자바에서의 소켓 프로그래밍
자바에서는 java.net 패키지를 사용하여 소켓 프로그래밍을 할 수 있습니다.
서버측 기본코드
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(5000)) {
System.out.println("Server is listening on port 5000");
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 (IOException 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("남철 : xxxxx");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 소켓 프로그래밍의 응용
- 웹 서버와 클라이언트 간 통신
- 파일 전송
- 채팅 애플리케이션
- 멀티플레이어 게임
'Java' 카테고리의 다른 글
1:1 단방향 통신 (Client) (0) | 2024.07.02 |
---|---|
1:1 단방향 통신 (Server) (0) | 2024.07.02 |
고수준 스트림 (Data/Object Stream) (0) | 2024.07.01 |
사용자모드 , 커널모드 (0) | 2024.06.28 |
로그와 파일 저장 (0) | 2024.06.28 |