oneiromant
@oneiromant
Еще новичёк в программировании

Как сделать, что бы в python чате сообщения, которые напечатал один клиент получал не только сервер, но и другие клиенты?

вот код сервера:
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 9090 ))
print('Server > local host')
clients = [] 

while True: 
data, addr = server_socket.recvfrom(1024)

if addr not in clients:
clients.append(addr)


print(data.decode('utf-8'))

for client in clients: 
server_socket.sendto(data, client)

server_socket.close()


вот код клиента
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.connect(('localhost', 9090))
server = ('localhost', 9090)

config = input('please enter your name: ')
client_socket.sendto(("["+config + "] => join chat ").encode("utf-8"),server)

i = False

while i == False:
message = input(':')
client_socket.sendto(('['+config + ']' + ':' + message).encode('utf-8'), server)

while True:
data = client_socket.recv(1024)




print(data.decode('utf-8'))

if not data:
break

client_socket.close()
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
@Serjio-Grig
Тот самый никто (=
.recv — приняли, .send — отправили.
Не забудьте использовать .encode().
А других пользователей можно где-либо хранить.
Например, в словаре. Так можно разделить и по комнатам.
Типа такого при подключении:

myUsers = {}
client_address, client_socket = server.accept()
myUsers.update({len(myUsers): client_socket})


Это позволит Вам хранить соединения всех пользователей и работать с любым в любом месте, в т.ч. вызывая send
Так же советую не использовать .recv(1024), а просто посылать в начале длину принимаемого сообщения, в виде заголовка.
Таким образом, Вы сможете принимать Сообщения длиной до 4х с чем-то миллиардов символов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы