728x90
쓰레드가 필요한 이유
기본 TCP 서버는 한 번에 하나의 클라이언트만 처리.
하나의 클라이언트가 접속해서 메시지를 주고받는 동안, 다른 클라이언트는 기다려야 함
-> 쓰레드를 사용하면 클라이언트마다 별도의 작업 흐름을 만들어 동시에 처리할 수 있게 됨.
쓰레드 예시
import threading
import time
def t1():
for i in range(5):
print("thread1 +++++")
time.sleep(0.1)
def t2():
for i in range(5):
print("thread2 +++++")
time.sleep(0.1)
th1 = threading.Thread(target=t1)
th2 = threading.Thread(target=t2)
th1.start()
th2.start()
th1.join()
th2.join()
print("main end")
쓰레드 서버
import socket
import threading
# 클라이언트 처리 함수
def thread_recv(client_socket, addr):
while True:
try:
recv_data = client_socket.recv(1024)
if not recv_data:
break
print(f"{addr}에서 보낸 메시지 : {recv_data.decode()}")
client_socket.sendall(recv_data)
if recv_data.decode() == "end":
print(f"{addr}에서 종료하고 싶어합니다.")
break
except ConnectionResetError:
print(f"{addr} 접속이 비정상 종료되었습니다.")
break
client_socket.close()
# 1. 서버 소켓 생성
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("", 9999))
sock.listen()
print("The Server Start.....")
# 2. 클라이언트 접속을 계속 받는 루프
while True:
conn, addr = sock.accept()
print(f"{addr} 연결됨")
# 클라이언트당 하나의 쓰레드 생성
recv_handler = threading.Thread(target=thread_recv, args=(conn, addr))
recv_handler.start()
클라이언트
import socket
# 1. 소켓 생성
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 접속시도
sock.connect(("127.0.0.1", 9999))
while True:
# 3-1. 데이터 송신
send_data = input("입력: ")
sock.sendall(bytes(send_data, "utf-8") )
if send_data == "end":
break
# 3-2. 데이터 수신
recv_data = sock.recv(1024)
print(f"recv : {recv_data}")
# 4. 접속 종료
print("클라이언트 종료!")
sock.close()
'정보보안' 카테고리의 다른 글
비대칭 암호화 (0) | 2025.05.27 |
---|---|
암호화, 대칭 암호화 (0) | 2025.05.26 |
소켓 통신 (0) | 2025.05.25 |
스니핑(Sniffing) (0) | 2025.04.20 |
네트워크, 전송 계층 TCP/IP 프로토콜의 연관성 (0) | 2025.04.15 |