2015-10-07 15 views
27

Im Folgenden ist der Code, den die Eingabe von einem Benutzer unter Verwendung von Buchsen zugeführt zu modifizieren versucht:Typeerror: ein Byte-ähnliches Objekt erforderlich ist, nicht ‚str‘

from socket import * 

serverName = '127.0.0.1' 
serverPort = 12000 
clientSocket = socket(AF_INET, SOCK_DGRAM) 
message = input('Input lowercase sentence:') 
clientSocket.sendto(message,(serverName, serverPort)) 
modifiedMessage, serverAddress = clientSocket.recvfrom(2048) 
print (modifiedMessage) 
clientSocket.close() 

Als ich es ausführen und liefern Eingang der folgende Fehler tritt auf:

Input lowercase sentence:fdsgfdf 
Traceback (most recent call last): 
    File "C:\srinath files\NETWORKS\UDPclient.py", line 6, in <module> 
    clientSocket.sendto(message,(serverName, serverPort)) 
TypeError: a bytes-like object is required, not 'str' 

Was kann ich tun, um dies zu lösen?

+4

Das erste Argument ('message') muss Bytes sein, aber Sie übergeben eine Zeichenfolge. Sie sollten es verschlüsseln, bevor Sie z. "Nachricht.kodieren ('utf-8') ' – mgilson

+0

aber die Sache ist ich brauche nicht – sri

+0

aus der Steckdose Import Bytestring an den Server zu übergeben * servername = 'hostname' serverport = 12000 Clientsocket = socket (AF_INET, SOCK_DGRAM) Nachricht = input ('Eingabe in Kleinbuchstaben:') message.encode ('utf-8') clientSocket.sendto (Nachricht, (serverName, serverPort)) modifiedMessage, serverAddress = clientSocket.recvfrom (2048) drucken (geänderteMeldung) clientSocket.close() – sri

Antwort

45

Dieser Code ist wahrscheinlich gut für Python 2. Aber in Python 3 wird dies ein Problem verursachen, etwas, das sich auf die Bitcodierung bezieht. Ich habe versucht, einen einfachen TCP-Server zu erstellen und stieß auf das gleiche Problem. Codierung funktionierte für mich. Versuchen Sie dies mit sendto Befehl.

clientSocket.sendto(message.encode(),(serverName, serverPort)) 

Ähnlich würden Sie .decode() verwenden, um die Daten auf dem UDP-Server-Seite zu empfangen, wenn Sie es genau drucken möchten, wie sie gesendet wurde.

+0

würde Codierung und Decodierung auf beiden Seiten der Verbindung Latenz erhöhen? Wenn ja, wäre python2 tatsächlich schneller beim Senden von Daten als python3. – Max

+0

Meiner Meinung nach hat das keine Auswirkungen auf die Leistung, wie Latenz usw. Allerdings habe ich nicht versucht, es selbst zu experimentieren, also kann ich mir da nicht sicher sein. – Umair47

6

Ein bisschen Codierung kann dieses Problem lösen:

Client Side:

message = input("->") 
clientSocket.sendto(message.encode('utf-8'), (address, port)) 

Server Side:

data = s.recv(1024) 
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode('utf-8')) 
+1

Ihr Client wird nicht funktionieren: sendto erfordert 3 Parameter, die Nachricht die Server-Adresse und den zugehörigen Port – dlewin

+0

@dlewin Sie haben Recht, guter Fang. Ich habe es aktualisiert – Wlliam

3

Einfach Nachrichtenparameter in clientSocket.sendto(message,(serverName, serverPort))-clientSocket.sendto(message.encode(),(serverName, serverPort)) weitergegeben ersetzen. Dann würden Sie erfolgreich in in python3 laufen

0

Jedes Mal, wenn Sie einen Fehler mit dieser Nachricht my_string.encode() Verwendung begegnen.

(wobei my_string die Zeichenfolge ist, die Sie an eine Funktion/Methode übergeben).

Die encode Methode der str Objekte gibt die codierte Version des Strings als bytes object, die Sie dann verwenden können. In dieser spezifischen Instanz erwarten die Socket-Methoden ein Byte-Objekt als zu sendende Daten, kein String-Objekt.

Da Sie ein Objekt vom Typ str haben und Sie vorbei, es zu einer Funktion/Methode, die ein Objekt des Typs erwartet bytes, wird ein Fehler ausgelöst, dass deutlich erklärt, dass:

TypeError: a bytes-like object is required, not 'str' 

So ist die encode

>>> s = "Hello world" 
>>> print(type(s)) 
<class 'str'> 
>>> byte_s = s.encode() 
>>> print(type(byte_s)) 
<class 'bytes'> 
>>> print(byte_s) 
b"Hello world" 

Hier wird das Präfix b in: Methode von Strings ist, auf einem str-Wert und Zurückgeben eines bytes Wert angewendet benötigtgibt an, dass dies tatsächlich ein Byte-Objekt ist. Sie können es dann an die Funktion übergeben, die es erwartet, damit es reibungslos läuft.

Verwandte Themen