서버가 1대가 돌아가고
클라이언트 여러대가 접속해서 각각 채팅을 이어나갈 수 있도록 만들어 봅시다.
클라이언트가 접속할 때마다 새로운 쓰레드를 생성해서 만들어 봅시다
해당 코드는 여기에
https://github.com/hyeonukdev/Python-Socket/tree/master/multi
해당 개념은 여기에
https://hyeonukdev.tistory.com/110
server.py
import socket
from _thread import *
from answer_handle import answer_handler
# 쓰레드에서 실행되는 코드입니다.
# 접속한 클라이언트마다 새로운 쓰레드가 생성되어 통신을 하게 됩니다.
def threaded(client_socket, addr):
print('Connected by :', addr[0], ':', addr[1])
# 클라이언트가 접속을 끊을 때 까지 반복합니다.
while True:
try:
# 데이터가 수신되면 클이언트에 다시 전송합니다.(에코)
data = client_socket.recv(1024)
if not data:
print('Disconnected by ' + addr[0], ':', addr[1])
break
print('Received from ' + addr[0], ':', addr[1], data.decode())
# answer_handler를 사용해서 커스텀해보세요.
result = answer_handler(data)
# string이기 때문에 encode를 통해서 bytes로 변환해주세요.
data = result.encode('utf-8')
client_socket.send(data)
except ConnectionResetError as e:
print('Disconnected by ' + addr[0], ':', addr[1])
break
client_socket.close()
HOST = '127.0.0.1'
PORT = 9999
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen()
print('server start')
# 클라이언트가 접속하면 accept 함수에서 새로운 소켓을 리턴합니다.
# 새로운 쓰레드에서 해당 소켓을 사용하여 통신을 하게 됩니다.
while True:
print('wait')
client_socket, addr = server_socket.accept()
start_new_thread(threaded, (client_socket, addr))
server_socket.close()
client.py
import socket
HOST = '127.0.0.1'
PORT = 9999
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
# 키보드로 입력한 문자열을 서버로 전송하고
# 서버에서 에코되어 돌아오는 메시지를 받으면 화면에 출력합니다.
# quit를 입력할 때 까지 반복합니다.
while True:
message = input('Enter Message : ')
if message == 'quit':
break
client_socket.send(message.encode())
data = client_socket.recv(1024)
print('Received from the server :',repr(data.decode()))
client_socket.close()
handle
def answer_handler(data):
# data는 바이트입니다 반드시 decode를 통해 string으로 변환하세요.
data = data.decode()
print("data: {}".format(data))
answer = data
if 'hello' in data:
answer = 'Nice to Meet You!'
return answer
elif 'bye' in data:
answer = 'Good Bye'
return answer
else:
return answer
채팅을 하고 핸들러에 있는 대화면 해당 answer로 return
반응형
'SW ENGINEERING > Programing' 카테고리의 다른 글
URL 규칙, RESTFul한 URL (0) | 2021.07.04 |
---|---|
Python Socket : 그룹 채팅 (0) | 2021.06.28 |
Python Socket : 1대1 채팅 (0) | 2021.06.28 |
Python Socket (0) | 2021.06.21 |
RESTful API (0) | 2021.05.31 |
최근댓글