Java

Socket

개발자공부 2024. 6. 10. 08:34

들어가기전

소켓은 컴퓨터 네트워킹에서 매우 중요한 역할을 하며, 특히 자바 I/O에서 자주 사용됩니다.

 

Socket

소켓은 네트워크 상에서 통신을 가능하게 하는 끝점이다. 두 컴퓨터 간에 데이터를 주고받기 위해 사용되는 인터페이스로, 소켓을 통해 네트워크 연결을 설정하고 데이터를 송수신할 수 있다. 

쉽게 말해 소켓은 네트워크를 통해 다른 컴퓨터와 대화하는 전화기 같은 역할을 한다.(소켓은 사실 파일 개념과 같다.)

소켓은 물리적인 장치가 아니라 추상적인 개념의 약속이다. 네트워크 통신을 위해 소프트웨어적으로 정의된 인터페이스로, 컴퓨터 간의 데이터 교환을 가능하게 하는 규칙과 방법을 의미한다. 이를 통해 네트워크 애플리케이션이 서로 통신할 수 있다.

 

Socket 종류

두 가지 주요 유형이 있다.

스트림 소켓(Stream Socket) : TCP (Transmission Control Protocol) 기반의 소켓. 연결 지향적이다. 데이터를 안정적으로 순서대로 에러 없이 전달할 수 있다. 예를 들어, 웹 브라우저와 웹 서버 간의 통신은 주로 스트림 소켓을 사용한다.

데이터그램 소켓(Datagram Socket) : UDP(User Datagram Protocol) 기반의 소켓으로, 비연결 지향적이다. 데이터를 빠르게 전송할 수 있지만, 데이터의 순서나 신뢰성은 보장되지 않는다. 실시간 게임이나 스트리밍에 자주 사용된다.

 

Socket 동작 방식

서버 측

소켓을 생성하고 포트 번호와 결합(Binding) 한다.

클라이언트의 연결 요청을 대기(Listening) 한다.

클라이언트의 연결 요청을 수락(Accept) 하고 통신할 준비를 한다.

 

클라이언트 측

소켓을 생성하고 서버의 주소와 포트 번호로 연결(Connection) 을 요청한다.

서버와 연결이 성공하면 데이터를 송수신할 수 있다.

 

자바에서의 소켓 프로그래밍

자바에서는 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();
        }
    }
}
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("연결되었습니다.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

 

소켓 프로그래밍 응용

소켓 프로그래밍은 다양한 응용 분야에 사용된다.

● 웹 서버와 클라이언트 간 통신

파일 전송

채팅 애플리케이션

멀티플레이어 게임