본문 바로가기
정보보안

쓰레드를 이용한 소켓 통신

by asd135 2025. 5. 25.
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