chatApp
Directory Structure
- server.py
- client.py
(poetry.lock, pyproject.toml 파일은 poetry를 이용하여 가상환경을 구성하여 나온 파일들입니다. 다른 가상환경을 사용해도 무방해요.)
라이브러리, 패키지
server.py
import names
from twisted.internet import protocol, reactor
COLORS = [
'\033[31m',
'\033[32m',
'\033[33m',
'\033[34m',
'\033[35m',
'\033[36m',
'\033[37m',
'\033[4m',
]
transports = set()
users = set()
class Chat(protocol.Protocol):
"""
채팅 서버의 로직 정의
"""
def connectionMade(self):
''' 사용자가 서버에 접속하면 'connected' 메시지 출력'''
name = names.get_first_name()
color = COLORS[len(users)%len(COLORS)]
users.add(name)
transports.add(self.transport)
self.transport.write(f'{color}{name}\
\033[0m'.encode('utf-8'))
def dataReceived(self, data):
'''사용자가 서버에 메시지를 보내면 실행 사용자 메시지(data) 출력'''
for t in transports:
if self.transport is not t:
t.write(data)
class ChatFactory(protocol.Factory):
'''통신 프로토콜 정의'''
def buildProtocol(self, addr):
return Chat()
print('Server started!')
reactor.listenTCP(8000, ChatFactory())
reactor.run()
client.py
import socket
import select
import sys
name = None
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',8000))
while True:
read, write, fail = select.select((s, sys.stdin), (), ())
for desc in read:
if desc == s:
data = s.recv(4096)
print(data.decode('utf-8'))
if name is None:
name = data.decode()
s.send(f'{name} is connected!'.encode('utf-8'))
else:
msg = desc.readline()
msg = msg.replace('\n','')
s.send(f'{name}: {msg}'.encode())