서버가 1대가 돌아가고

클라이언트 여러대가 접속해서 각각 채팅을 이어나갈 수 있도록 만들어 봅시다.

 

클라이언트가 접속할 때마다 새로운 쓰레드를 생성해서 만들어 봅시다

 

해당 코드는 여기에

https://github.com/hyeonukdev/Python-Socket/tree/master/multi

 

hyeonukdev/Python-Socket

Contribute to hyeonukdev/Python-Socket development by creating an account on GitHub.

github.com


해당 개념은 여기에

https://hyeonukdev.tistory.com/110

 

Python Socket

Socket을 활용한 TCP server/client TCP : Transmission Control Protocol - 수신자가 전달 받지 못한 패킷을 발신자가 감지하여 재전송하기 때문에 신뢰성 높음 - 발신자가 전송한 순서대로 수신자에서 읽기 가능

hyeonukdev.tistory.com


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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기