Создание простого приложения чата на Python (сокеты)Python

Программы на Python
Anonymous
Создание простого приложения чата на Python (сокеты)

Сообщение Anonymous »

Я пытаюсь создать простое приложение для чата с использованием сокетов (Python). Когда клиент может отправить сообщение серверу, а сервер просто транслирует сообщение всем остальным клиентам, кроме того, кто его отправил.

Клиент имеет два потока, которые выполняются навсегда


send: Отправить просто отправляет сообщение клиента на сервер.

receive: получить сообщение от сервера.


На сервере также есть два потока, которые выполняются вечно

accept_cleint: принять входящее соединение от клиента.

broadcast_usr: принимает сообщение от клиента и просто передает его всем остальным клиентам.


Но я получаю ошибочный вывод (Пожалуйста, обратитесь к изображению ниже). Предполагается, что все потоки активны постоянно, но иногда клиент может отправлять сообщения, а иногда нет. Скажем, например, Трейси отправляет «привет» 4 раза, но это не транслируется. Когда Джон говорит «пока» 2 раза, то 1 раз его сообщение транслируется по телевидению. Кажется, на сервере возникла проблема с синхронизацией потоков, я не уверен. Пожалуйста, скажите мне, что случилось.

Изображение


Ниже приведен код.

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[1].recv(1024)
if data:
b_usr(CONNECTION_LIST[1], CONNECTION_LIST[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[1] != cs_sock):
CONNECTION_LIST[1].send(sen_name)
CONNECTION_LIST[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()


Подробнее здесь: https://stackoverflow.com/questions/360 ... on-sockets

Вернуться в «Python»