본문 바로가기

카테고리 없음

Python 네트워크 구성하기

파이썬에서 socket 모듈은 TCP와 UDP를 사용하는 서버 및 클라이언트

원시 소켓 등을 손쉽고 빠르게 구축할 수 있도록 하는 필수 요소를 내장한다.

우선 파이썬으로 간단한 서버 및 클라이언트 프로그램을 작성해본다.

socket의 진행구조

TCP 클라이언트를 만들때는 연결 과정이 크게 복잡하지는 않다. 소켓을 생성하고 서버와 연결한 후

데이터를 송수신하는 구조를 지닌다.

 

TCP 서버를 만들때는 클라이언트보다 다소 복잡한 과정을 거치는데 소켓을 생성한 후(socket.socket)

시작을 위해 서버가 수신을 대기할 IP 주소와 포트를 연결(bind)해준다.

그 다음 클라이언트의 접속을 대기(listen)한다. 이후 클라이언트를 연결(accept)을 한다.

 

*TCP_Client 구성하기

import socket
HOST = '127.0.0.1'
PORT = 5555

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

client.send("ABCDEF".encode())
response = client.recv(4096)

print(response.decode('utf-8'))
client.close()

host는 루프백 주소로 하든 구글의 주소를 하든 크게 문제는 없다.

우선 clinet에 socket을 생성한다. 이때 AF_INET은 IPv4를 뜻하며 SOCK_STREAM은 TCP 를 사용한다는 뜻이다.

클라이언트 서버에 연결(connet)하고 데이터를 전송(send)한다.

이후 응답(recv) 메시지를 출력하고 종료(close)한다.

 

*TCP_SERVER 구성하기

import socket
import threading

IP = '0.0.0.0'
PORT = 5555
def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP,PORT))
    server.listen(5)
    print(f'[*] Listening on {IP}:{PORT}')
    while True:
        client, address = server.accept()
        print(f'[*] Accenpted connection from {address[0]}:{address[1]}')
        client_handler = threading.Thread(target= handle_client, args=(client,))
        client_handler.start()

def handle_client(client_socket):
    with client_socket as sock:
        request = sock.recv(1024)
        print(f'[*] Received : {request.decode("utf-8")}')
        sock.send('Good'.encode())

if __name__ == '__main__':
    main()

시작을 위해 서버가 수시을 대기할 IP와 포트를 지정(bind)한다.

그리고 연결 허용의 최댓값을 5로 설정(listen(5))하고 대기한다.

그러면 서버는 반복문에 진입하여 새로운 연결이 될 때까지 기다리게 된다.

클라이언트가 연결을 시도(accept)하면 해당 클라이언트 소켓은

client변수에 원격 연결의 세부정보는 address에 저장한다.

하나의 클라이언트가 실행될때 다른 클라이언트의 접속을 위해  새로운 스레드 객체를 생성하여 실행한다.

이를 위해 handle_client 함수를 만들고 호출한다.

handle_client함수는 recv함수를 호출한 후 간단한 메시지를 클라이언트에 응답으로 돌려준다.

 

위 코드들을 실행하면 다음과 같은 결과가 출력된다.

Server
Client