-
Python 문법 기초 37 - 멀티 채팅 서버 프로그램(socket + thread)Python 2022. 10. 23. 14:02
# 멀티 채팅 서버 프로그램 - socket + thread import socket import threading ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ss.bind(('127.0.0.1', 5000)) ss.listen(5) print('채팅 서버 서비스 시작...') users = [] def chatUser(conn): name = conn.recv(1024) data = '^^ ' + name.decode('utf-8') + '님 입장' print(data) try: for p in users: p.send(data.encode('utf-8')) while True: msg = conn.recv(1024) if not msg:continue data = name.decode('utf-8') + '님 메세지:' + msg.decode('utf-8') print('수신 내용 : ', data) for p in users: p.send(data.encode('utf-8')) except: users.remove(conn) # user가 빠져나갔을 때 err 를 일으킴으로 해당 user를 삭제한다. data = '~~~' + name.decode('utf-8') + '님 퇴장 ~~' print(data) if users: for p in users: p.send(data.encode('utf-8')) else: print('사용자가 없습니다.') while True: conn, addr = ss.accept() users.append(conn) # 클라이언트를 저장 th = threading.Thread(target=chatUser, arg=(conn,)) th.start()
여러 명이 들어와서 채팅을 하므로 thread를 돌리면서 모든 접속자와 채팅을 할 수 있게 된다.(멀티 테스킹)
user가 나갔을 때 err를 일으키므로 excet에 빠져나간 user의 id를 삭제한다.
# 채팅 클라이언트 import socket import threading import sys def handle(socket): while True: data = socket.recv(1024) if not data:continue print(data.decode('utf-8')) # 파이썬의 표준출력은 버퍼링이 되는데 이때 버퍼를 비우기 sys.stdout.flush() name = input('채팅 아이디 입력:') cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) cs.connect(('127.0.0.1', 5000)) cs.send(name.encode('utf_8')) th = threading.Thread(target=handle, args=(cs, )) th.start() while True: msg = input() sys.stdout.flush() if not msg:continue cs.send(msg.encode('utf_8')) cs.close()
IP 주소는 자신의 번호인 127.0.0.1로 설정해놨지만 클라이언트에서는 ip주소를 채팅할 컴퓨터의 ip주소를 적으면 그 컴퓨터와 채팅 가능하다.
'Python' 카테고리의 다른 글
Python 문법 기초 36 - 웹 크롤링(Crawling)과 웹 스크래핑(Scraping)의 차이점 (0) 2022.10.23 Python 문법 기초 35 - 멀티 thread(병렬구조) (0) 2022.10.23 Python 문법 기초 34 - thread(자원공유, 활성화/비활성화) (0) 2022.10.23 MariaDB 연동 예제 (0) 2022.10.22 Python 문법 기초 33 - MyriaDB 연동(명령어) (0) 2022.10.22