[Networking] Socket Programming

소켓(Socket)이란?

네트워크를 통해 양단 간의 데이터를 주고 받는 관계를 의미한다. 쉽게 생각해서 네트워크로 서로 연결된 대상들의 데이터들이 드나드는 통로라고 봐도 좋다.

일반적으로 Server-Client 구조로 이루어져 있다.


소켓 프로그래밍(Socket Programming)

서버와 클라이언트가 소켓 프로그래밍을 이용하여 통신을 할 때, 대표적인 프로토콜로 TCP와 UDP가 있다.

1. TCP Socket 통신

TCP는 일반적으로 서버와 클라이언트 간의 연결 과정이 필요하다. 때문에 데이터를 주고받을 때 안정성이나 신뢰성이 보장되지만 속도는 그만큼 느려진다.

Python TCP Echo Server Example

import socket

HOST = '127.0.0.1'  
PORT = 65456  

print('> 에코 서버 활성화')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serverSocket:
    serverSocket.bind((HOST, PORT))
    serverSocket.listen()
    clientSocket, clientAddress = serverSocket.accept()
    with clientSocket:
        print('> client connected by IP address {0} with Port number {1}'.format(clientAddress[0], clientAddress[1]))
        while True:
            # 데이터를 받고 보내는 과정
            RecvData = clientSocket.recv(1024)
            print('> echoed:', RecvData.decode('utf-8'))
            clientSocket.sendall(RecvData)
            if RecvData.decode('utf-8') == 'quit':
                break
print('> 에코 서버 비활성화')


Python TCP Echo Client Example

import socket

HOST = '127.0.0.1'
PORT = 65456

print('> 에코 클라이언트 활성화')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as clientSocket:
    clientSocket.connect((HOST, PORT))
    while True:
        # 데이터를 보내고 받는 과정
        sendMsg = input("> ")
        clientSocket.sendall(bytes(sendMsg, 'utf-8'))
        recvData = clientSocket.recv(1024)
        print('> received:', recvData.decode('utf-8'))
        if sendMsg == "quit":
            break

print('> 에코 클라이언트 비활성화')


2. UDP Socket 통신

UDP는 TCP와는 다르게 서버와 클라이언트 간의 연결 설정 과정이 존재하지 않는다. 따라서 데이터를 주고 받을 때 안정성이나 신뢰성을 보장하지는 못하지만 통신 속도 측면에서 이득을 가져올 수 있다.

Python UDP Server Example

import socket

HOST = '127.0.0.1'  
PORT = 65456  

print('> 서버 활성화')
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as serverSocket:
    serverSocket.bind((HOST, PORT))
    clientSocket, clientAddress = serverSocket.recvform(200)
print('> 서버 비활성화')


Python UDP Client Example

import socket

HOST = '127.0.0.1'  
PORT = 65456  

print('> 클라이언트 활성화')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as clientSocket:
    clientSocket.sendto('message', (HOST, PORT))
print('> 클라이언트 비활성화')

마치며

Socket 프로그래밍에는 다양한 유형의 예제들과 사용법이 존재하고 Local 환경이 아닌 외부와 통신하기 위해서는 여러 인증 절차를 거쳐야 하기도 한다.

따라서 다양한 통신 구조 속에서 알맞은 구조를 선택하여 자신에게 적합한 통신 환경을 구축하는 것을 목표로 하기를 바란다.