2017-10-13 1 views
0

Server Code:Python-Sockets - Client nicht UDP-Datagramm empfangen

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # server UDP socket 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # bypass OS lock on port 
s.bind((socket.gethostname(), 9999)) # bind socket to host and port 9999 
while True: 
    message, ip = s.recvfrom(1024) # receive data passed through socket 
    print "Server:\n\tMessage \"{}\" received...\n\tIt has a length of {}".format(
      message, len(message)) 
    s.sendto(str(len(message)), (socket.gethostname(), 9999)) # send message length in bytes back to client 
    s.close() # close UDP connection with client 
    sys.exit(0) # terminate server process 

Code Auftraggeber:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect((socket.gethostname(), 9999)) 
message = "Pointless text." 
print "Client:\n\tSending message \"{}\" to the server...\n\tIt has a length of {}".format(
     message, len(message)) 
s.sendto(message, (socket.gethostname(), 9999)) 
while True: 
    response, ip = s.recvfrom(1024) 
    if int(response) == len(message): 
     print "Client:\n\tThe server returned count {} which is equal to the client's count of {}.".format(response, len(message)) 
    else: 
     print "Client:\n\tThe server returned count {} which is not equal to the client's count of {}.".format(response, len(message)) 
s.close() 

Ausgang:

Running client in UDP mode... 
Running server in UDP mode... 

Client: 
    Sending message "Pointless text." to the server... 
    It has a length of 15 
Server: 
    Message "Pointless text." received... 
    It has a length of 15 

Die Client-Seite recvfrom wird nie ausgelöst und ich kann nicht herausfinden, warum.

Hier sind die komplette client und server Dateien, wenn Sie sie direkt auf Ihrem Rechner testen wollen, wie so:

python2.7 server udp & python2.7 client udp 

Antwort

2

In Ihrem Server-Code, Sie sind das Ergebnis an die Adresse des Servers Senden (9999), nicht die des Kunden (ip).

Try this:

s.sendto(str(len(message)), ip) # send message length in bytes back to client 
+0

Danke Sir. Ich nahm den Client-Code 's.connect ((socket.gethostname(), 9999))' würde den Client-Socket für den Empfang auf Port 9999 und den Client-Code 's.sendto (Nachricht, (socket.gethostname(), 9999 konfigurieren)) 'würde den Socket so konfigurieren, dass er an Port 9999 sendet ... Kannst du erklären, warum die Adresse in' connect() 'notwendig ist, wenn der Empfangsport nicht konfiguriert ist und' sendto() 'den Zielport behandelt? – aweeeezy

+0

Eigentlich habe ich gerade meine eigene Frage beantwortet - das Entfernen der 'connect()' Zeile hat keine Auswirkungen auf mein Programm. – aweeeezy

Verwandte Themen