2017-04-25 3 views
1

machen Ich mache eine kleine Chat-Anwendung in Python mit UDP-Sockets. Ich habe es eingerichtet, wo der Benutzer seinen Benutzernamen wählen und dann Nachrichten an den Server senden würde. Der Server würde dann die Nachricht an jeden verbundenen Client senden. Ich habe es geschafft, dass der Server funktioniert und der Client kann Nachrichten an den Server senden. Das Problem besteht darin, dass der Server die Nachrichten nicht an die anderen verbundenen Clients sendet. HierUDP Python: Wie man den Server Broadcast Nachrichten die Clients senden in der UDP Chatroom

ist der Server-Code:

from socket import * 
    import socket 
    port = 1234 
    localhost='127.0.0.1' 
    #Create a socket 



try : 
    s = socket.socket(AF_INET, SOCK_DGRAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
    print ('Socket created') 
except socket.error: 
    print ('Error creating socket.') 
    sys.exit() 
#Bind the socket to port and localhost. 
try: 
    s.bind((localhost, port)) 
except socket.error: 
    print ('Error while binding.') 
    sys.exit() 
print ('Bind complete.')  

while 1: 
    # receive data from client (data, addr) 
    d = s.recvfrom(2048) 
    data = d[0] 
    addr = d[1] 

    if not data: 
     break 
    print('Client connected at ' + addr[0] + ':' + str(addr[1])) 

    print('Message[' + addr[0] + ':' + str(addr[1]) + '] - ' +      
    data.strip().decode("utf-8")) 
    s.close() 

Client-Code:

from socket import * 
import socket 
import sys 
port=1234 
localhost='127.0.0.1' 


try: 
    s = socket.socket(AF_INET, SOCK_DGRAM) 
except socket.error: 
    print ('Error creating socket.') 
    sys.exit() 
print ("Connected to chat") 
Username= input('Please choose a username: ') 
while(1) : 
msg = input ('Enter message to send : ') 

try : 
    #Set the whole string 
    s.sendto('{}: {}'.format(Username,msg).encode('utf-8'), (localhost,port)) 
    # receive data from server (data, addr) 
    data = s.recvfrom(2048) 
    reply = data[0] 
    addr = data[1] 

    print (+ reply.decode()) 

except socket.error: 
    print ('Error sending message ') 
    sys.exit() 

Irgendwelche Vorschläge?

Antwort

1

Ich denke, Sie sind verwirrt darüber, was socket.SO_BROADCAST tut. Es führt nicht dazu, dass alle empfangenen Nachrichten an alle Clients gesendet werden. Es wird verwendet, um dem Netzwerkstack auf dem Rechner mitzuteilen, dass ein Socket zum Senden von Broadcast-Paketen verwendet werden kann (damit meine ich ein Paket mit einer Zieladresse, die als "Broadcast-Adresse" gilt - dies schließt das Netzwerk und Broadcast-Adressen für ein Subnetz, z. B. 192.168.0.0 oder 192.168.0.255 für das Subnetz 192.168.0.0/24).

Damit Ihre Chat-App wie gewünscht funktioniert, müssen Sie ein Protokoll aller verbundenen Clients führen. Wenn Sie eine Nachricht erhalten, können Sie sie dann erneut an alle Clients senden, die s.sendto() verwenden.

0

Hey Kumpel Sie sollten wirklich dafür verwenden asyncio: (49mins) https://www.youtube.com/watch?v=ZzfHjytDceU

Aber was müssen Sie tun, ist ein Objekt der Benutzer erstellen und sie dann senden die Daten

Zusätzlich Sie don‘ Es scheint so zu sein, als würden die Daten saniert: Länge und Inhalt sollten begrenzt sein. Grundsätzlich:

from html import escape 
clients = {} 

... 

msg = escape(msg_received[:2048]) 
for c in clients: 
    c.send(msg) 
Verwandte Themen