Я пытаюсь создать простое приложение чата с помощью сокетов (python). Если клиент может отправить сообщение серверу и серверу, просто передайте сообщение всем другим клиентам, кроме тех, кто его отправил.Создание простого приложения чата в Python (Sockets)
Клиент имеет две нити, которые бегут навсегда
send
: Отправить просто отправляет сообщение cleints к серверу.
receive
: Получить сообщение с сервера.
Сервер также имеет две темы, которые бегут навсегда
accept_cleint
: Для того, чтобы принять входящее соединение от клиента.
broadcast_usr
: Принимает сообщение от клиента и передает его всем другим клиентам.
Но я получаю ошибочный результат (см. Изображение ниже). Все потоки предполагают быть активными все время, но иногда клиент может отправлять сообщения, иногда это невозможно. Скажем, например, Трейси отправляет «привет» 4 раза, но его не транслируют, когда Джон говорит «до свидания» 2 раза, а затем 1 раз его сообщение получает ловушку. Кажется, есть проблема thread synchronization
на сервере, я не уверен. Пожалуйста, скажите мне, что случилось.
Ниже приведен код.
chat_client.py
import socket, threading
def send():
while True:
msg = raw_input('\nMe > ')
cli_sock.send(msg)
def receive():
while True:
sen_name = cli_sock.recv(1024)
data = cli_sock.recv(1024)
print('\n' + str(sen_name) + ' > ' + str(data))
if __name__ == "__main__":
# socket
cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect
HOST = 'localhost'
PORT = 5023
cli_sock.connect((HOST, PORT))
print('Connected to remote host...')
uname = raw_input('Enter your name to enter the chat > ')
cli_sock.send(uname)
thread_send = threading.Thread(target = send)
thread_send.start()
thread_receive = threading.Thread(target = receive)
thread_receive.start()
chat_server.py
import socket, threading
def accept_client():
while True:
#accept
cli_sock, cli_add = ser_sock.accept()
uname = cli_sock.recv(1024)
CONNECTION_LIST.append((uname, cli_sock))
print('%s is now connected' %uname)
def broadcast_usr():
while True:
for i in range(len(CONNECTION_LIST)):
try:
data = CONNECTION_LIST[i][1].recv(1024)
if data:
b_usr(CONNECTION_LIST[i][1], CONNECTION_LIST[i][0], data)
except Exception as x:
print(x.message)
break
def b_usr(cs_sock, sen_name, msg):
for i in range(len(CONNECTION_LIST)):
if (CONNECTION_LIST[i][1] != cs_sock):
CONNECTION_LIST[i][1].send(sen_name)
CONNECTION_LIST[i][1].send(msg)
if __name__ == "__main__":
CONNECTION_LIST = []
# socket
ser_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind
HOST = 'localhost'
PORT = 5023
ser_sock.bind((HOST, PORT))
# listen
ser_sock.listen(1)
print('Chat server started on port : ' + str(PORT))
thread_ac = threading.Thread(target = accept_client)
thread_ac.start()
thread_bs = threading.Thread(target = broadcast_usr)
thread_bs.start()
Я думаю, что проблема связана с циклами ваших клиентских потоков, хотя ваш сервер также должен иметь возможность обращаться с клиентским отключением. – pholtz
Just FYI, ** Twisted ** - это библиотека Python для создания поточных серверов. – Fattie