❄️ 파이썬으로 [ 소켓통신 ]하는 방법을 알아보자
- socket통신을 들어가기 전에...
1. client-server 사이 socket이 어떻게 전달되는지 미리 알아둬야 함
2. blocking과 non-blocking의 차이점을 알아야함
❄️ server.py [ server ]
import socket
import threading
"""
변수정의
"""
PORT = 9999
SERVER = ''
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
MAX_CONN = 10
BUFSIZE = 1024
server_socket = None
def ready():
global server_socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((ADDR))
server_socket.listen(MAX_CONN)
if server_socket is not None:
return True
# thread에서 실행되는 code
# 접속한 client마다 새로운 thread 생성, 통신
def threaded(conn, addr):
print('[CONNECTED BY]:', addr[0], ':', addr[1])
while True:
try:
data = conn.recv(BUFSIZE)
if not data:
print('[DISCONNECTED BY]: ' + addr[0], ':', addr[1])
break
else:
print('[RECEIVED FROM]: ' + addr[0], ':', addr[1], data.decode(FORMAT))
conn.send(data)
except ConnectionResetError as e:
print('[DISCONNECTED BY]: ' + addr[0], ':', addr[1])
break
except KeyboardInterrupt as e:
print('keyboard interrupt')
break
conn.close()
# client가 접속 -> accept() 새로운 socket return
# 새로운 thread에서 해당 socket을 사용하여 통신
while True:
if ready():
conn, addr = server_socket.accept()
t = threading.Thread(target=threaded, args=(conn, addr))
t.daemon = True
t.start()
else:
print('[SOCKET] CONNECTION ERROR')
break
server_socket.close()
❄️ client.py [ client ]
import socket
import random
import time
SERVER = '127.0.0.1'
PORT = 9999
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
BUFSIZE = 1024
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ADDR))
for i in range(10):
rand_num = round(random.uniform(0, 50), 1)
message = f"[RANDOM MESSAGE: ] {rand_num}"
client_socket.send(message.encode())
time.sleep(2)
client_socket.close()
====client에서 원하는 만큼 데이터를 보내고 테스트를 해봤다면 cmd/terminal에서 server process를 종료시켜주자.
windows는 taskkill -f /pid [ pid_no ]이다.
'Server-Side Script > Python' 카테고리의 다른 글
python 특별한 methods (0) | 2021.10.27 |
---|---|
Django REST API 공식문서 요약본 (0) | 2021.10.26 |
django db + migration (0) | 2021.09.30 |
django project 설정 / setup (0) | 2021.09.27 |
파이썬 인공지능 라이브러리 (2) | 2021.08.31 |
댓글