파이썬에서 socket 모듈은 TCP와 UDP를 사용하는 서버 및 클라이언트
원시 소켓 등을 손쉽고 빠르게 구축할 수 있도록 하는 필수 요소를 내장한다.
우선 파이썬으로 간단한 서버 및 클라이언트 프로그램을 작성해본다.

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함수를 호출한 후 간단한 메시지를 클라이언트에 응답으로 돌려준다.
위 코드들을 실행하면 다음과 같은 결과가 출력된다.

