인공지능 공부/남박사의 파이썬 실전

(인프런) 파이썬 실전 다중 Thread 채팅프로그램 만들기

import socket
from threading import Thread

def recv_message(sock):
    while True:
        msg = sock.recv(1024)
        print(msg.decode())

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 12000))
th = Thread(target=recv_message, args=(sock, ))
th.daemon = True
th.start()

while True:
    msg = input("입력 >")
    sock.send(msg.encode())

    if msg == "/by":
        break


​
import socketserver

class MyHandler(socketserver.BaseRequestHandler):
    users = {}
    def send_all_message(self, msg):
        for sock, _ in self.users.values():
            sock.send(msg.encode())


    def handle(self):
        ##client_address는 BaseRequestHandler에 있음
        print(self.client_address)

        while True:
            self.request.send("채팅 닉네임을 입력하세요:".encode)  ##접속되어 있는 소켓을 의미함. BaseRequestHandler 여기에 있음
            nickname = self.request.recv(1024).decode()

            if nickname in self.users:
                self.request.send("이미 등록된 닉네임 입니다. \n".encode())
            else:
                self.users[nickname] = (self.request, self.client_adrress)
                print("현재 {}명 참여중".format(len(self.users)))
                self.send_all_message("[{}]님이 입장 했습니다.".format(nickname))
                break
        ##실제 채팅구현
        while True:
            msg = self.request.recv(1204)
            if msg.decode() =="/bye":
                self.request.close()
                break
            self.send_all_message("[{}] {}".format(nickname, msg.decode()))
        
        if nickname in self.users:
            del self.users[nickname]
            self.send_all_message("[{}]님이 퇴장하셨습니다.".format(nickname))
            print("현재 {}명 참여중".format(len(self.users)))
            
class ChatServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

server = ChatServer(("", 12000), MyHandler ) ##BaseRequestHandler
server.serve_forever()
server.shutdown
server.server_close()