socket

혜쿰·2023년 10월 17일
0
post-thumbnail

소켓은 컴퓨터 네트워크에서 데이터 통신을 가능하게 하는 중요한 소프트웨어 개념이다. 소켓은 네트워크 통신을 구현하고 관리하는데 사용되며, 주로 TCP/IP 기반의 네트워크에서 데이터를 주고받을 때 쓰인다.

💡 소켓의 정의

  • 소켓은 네트워크 통신을 위한 프로그래밍 인터페이스이다. 이것은 프로그래머가 네트워크를 통해 데이터를 보내고 받을 수 있도록 도와준다.
  • 소켓은 양 끝점(End Point)으로 구성되며, 데이터가 전송되는 곳을 나타내는 주소와 포트 번호로 식별된다.

💡 소켓 타입

  • 소켓은 주로 두 가지 유형으로 구분괸다 : 클라이언트 소켓 & 서버 소켓
    • 클라이언트 소켓: 클라이언트 프로그램에서 사용되며, 서버로 데이터를 보내기 위해 연결을 생성하고 관리한다.
    • 서버 소켓: 서버 프로그램에서 사용되며, 클라이언트의 연결 요청을 수락하고 데이터를 처리한다.

💡 소켓 프로토콜

  • 소켓은 다양한 네트워크 프로토콜을 지원한다. 주로 사용되는 것은 TCP/IP 및 UDP이다.
    • TCP (Transmission Control Protocol): 신뢰성 있는 연결 기반 프로토콜로, 데이터 전송 중 손실이나 중복을 방지한다.
    • UDP (User Datagram Protocol): 비연결성 프로토콜로, 데이터를 빠르게 보내지만 전송 중에 손실이나 순서가 보장되지 않는다.

💡 소켓 통신의 단계

  1. 소켓 생성: 프로그램에서 소켓을 만든다.
  2. 주소와 포트 바인딩: 서버는 특정 주소와 포트에 바인딩하고 클라이언트는 서버 주소로 연결을 시도한다.
  3. 연결 수립 (TCP의 경우): 클라이언트가 서버에 연결을 요청하고 서버가 수락한다.
  4. 데이터 전송: 데이터를 읽고 쓰며 통신한다.
  5. 연결 종료: 통신이 끝나면 연결을 종료한다.

소켓 프로그래밍은 네트워크 애플리케이션을 개발하는 데 필수적이며, 다양한 프로그래밍 언어에서 지원된다. 이를 통해 클라이언트와 서버 간에 데이터를 안전하게 교환하고 네트워크 애플리케이션을 구축할 수 있다.

💡 코드 예시

1. python

서버 코드

import socket

# 서버 주소와 포트 번호 설정
server_address = ('127.0.0.1', 12345)

# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버 소켓을 지정한 주소와 포트에 바인딩
server_socket.bind(server_address)

# 연결 대기
server_socket.listen(1)
print("서버가 연결을 기다립니다...")

# 클라이언트 연결 수락
client_socket, client_address = server_socket.accept()
print("클라이언트가 연결되었습니다:", client_address)

while True:
    # 클라이언트로부터 데이터 수신
    data = client_socket.recv(1024)
    if not data:
        break  # 연결이 종료되면 루프를 빠져나옵니다.
    
    # 수신한 데이터 출력
    print(f"수신한 데이터: {data.decode()}")

    # 클라이언트에 응답 보내기
    response = "서버가 데이터를 받았습니다."
    client_socket.send(response.encode())

# 연결 종료
client_socket.close()
server_socket.close()

클라이언트 코드

import socket

# 서버 주소와 포트 번호 설정
server_address = ('127.0.0.1', 12345)

# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버에 연결
client_socket.connect(server_address)

while True:
    # 사용자로부터 메시지 입력
    message = input("메시지를 입력하세요 (종료하려면 'exit' 입력): ")
    if message == 'exit':
        break
    
    # 메시지를 서버로 전송
    client_socket.send(message.encode())
    
    # 서버로부터 응답 받기
    data = client_socket.recv(1024)
    print(f"서버 응답: {data.decode()}")

# 연결 종료
client_socket.close()

2. java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        int port = 12345;

        try {
            // 서버 소켓 생성
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("서버가 연결을 기다립니다...");

            // 클라이언트 연결 대기
            Socket clientSocket = serverSocket.accept();
            System.out.println("클라이언트가 연결되었습니다.");

            // 클라이언트와 통신할 입력 및 출력 스트림 생성
            InputStream inputStream = clientSocket.getInputStream();
            OutputStream outputStream = clientSocket.getOutputStream();

            byte[] buffer = new byte[1024];
            int bytesRead;

            while (true) {
                // 클라이언트로부터 데이터 읽기
                bytesRead = inputStream.read(buffer);
                if (bytesRead == -1) {
                    break; // 연결이 종료되면 루프를 종료합니다.
                }

                String receivedData = new String(buffer, 0, bytesRead);
                System.out.println("수신한 데이터: " + receivedData);

                // 클라이언트에 응답 보내기
                String response = "서버가 데이터를 받았습니다.";
                outputStream.write(response.getBytes());
            }

            // 연결 종료
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0개의 댓글