Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

Socket 본문

Java

Socket

햄발자 2024. 7. 1. 17:42

 

 

소켓(Socket)

 

소켓 은 네트워크 상에서 통신을 가능하게 하는 끝점을 의미합니다. 두 컴퓨터 간의 데이터를 주고받기 위해 사용되는 인터페이스로, 소켓을 통해 네트워크 연결을 설정하고 데이터를 송수신할 수 있습니다. 쉽게 말해, 소켓은 네트워크를 통해 다른 컴퓨터와 대화하는 전화기 같은 역할을 합니다. (소켓은 사실 파일 개념과 같다)


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

 

 

일반 사용자 컴퓨터에서 네트워크 통신에 사용되는 주요 물리적 장치는 네트워크 인터페이스 카드(NIC), 모뎀, 라우터, 스위치, 액세스 포인트, 그리고 이더넷 케이블입니다. 이 장치들은 함께 작동하여 인터넷과의 연결을 설정하고, 데이터 통신을 가능하게 합니다.

 

네트워크 인터페이스 카드(NIC) / 랜카드(LAN Card)

  • 역할 : 컴퓨터를 네트워크에 연결하는 장치입니다.
  • 유형
    1. 유선 NIC(이더넷 카드) : 이더넷 케이블을 통해 네트워크에 연결합니다.
    2. 무선 NIC(와이파이 카드) : 무선 신호를 통해 네트워크에 연결합니다.

 

2. 소켓의 종류

  1. 스트림 소켓(Stream Socket): TCP(Transmission Control Protocol) 기반의 소켓으로, 연결 지향적입니다. 데이터를 안정적으로, 순서대로, 에러 없이 전달할 수 있습니다. 예를 들어, 웹 브라우저와 웹 서버 간의 통신은 주로 스트림 소켓을 사용합니다.
  2. 데이터그램 소켓(Datagram Socket): UDP(User Datagram Protocol) 기반의 소켓으로, 비연결 지향적입니다. 데이터를 빠르게 전송할 수 있지만, 데이터의 순서나 신뢰성은 보장되지 않습니다. 실시간 게임이나 스트리밍에 자주 사용됩니다.

 

3. 소켓의 동작 방식

 

  1. 서버 측:
    • 소켓을 생성하고 포트 번호와 결합(Binding)합니다.
    • 클라이언트의 연결 요청을 대기(Listening)합니다.
    • 클라이언트의 연결 요청을 수락(Accept)하고 통신할 준비를 합니다.
  2. 클라이언트 측:
    • 소켓을 생성하고 서버의 주소와 포트 번호로 연결(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