it-swarm.com.de

TypeError: ein byteähnliches Objekt ist erforderlich, nicht 'str'

Der folgende Code versucht, die von einem Benutzer über Sockets bereitgestellten Eingaben zu ändern:

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()

Wenn ich es ausführe und eine Eingabe mache, tritt der folgende Fehler 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 das zu lösen?

46
sri

Dieser Code ist wahrscheinlich gut für Python 2. Aber in Python 3 wird dies zu einem Problem führen, das etwas mit der Bitcodierung zu tun hat Einfacher TCP Server und das gleiche Problem aufgetreten. Die Codierung hat bei mir funktioniert. Versuchen Sie dies mit dem Befehl sendto.

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

Ebenso würden Sie .decode() verwenden, um die Daten auf der UDP-Serverseite zu empfangen, wenn Sie sie genau so drucken möchten, wie sie gesendet wurden.

61
Umair47

Das Kodieren und Dekodieren kann in Python 3:

Client-Seite:

>>> Host='127.0.0.1'
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.connect((Host,port))
>>> st='connection done'
>>> byt=st.encode()
>>> s.send(byt)
15
>>>

Serverseite:

>>> Host=''
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.bind((Host,port))
>>> s.listen(1)
>>> conn ,addr=s.accept()
>>> data=conn.recv(2000)
>>> data.decode()
'connection done'
>>>
16
Ahmed Motawea

Ein bisschen Kodierung kann das lösen:

Client-Seite:

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

Serverseite:

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

Ersetzen Sie einfach den in clientSocket.sendto(message,(serverName, serverPort)) an clientSocket.sendto(message.encode(),(serverName, serverPort)) übergebenen Nachrichtenparameter. Dann würden Sie erfolgreich in python ausführen

4
Abhijeet

Wenn bei dieser Meldung ein Fehler auftritt , verwenden Sie my_string.encode().

(wo my_string ist der String, den Sie an eine Funktion/Methode übergeben.

Die encode -Methode von str -Objekten gibt die codierte Version des Strings als bytes -Objekt zurück, das Sie dann verwenden können. In diesem speziellen Fall Socket-Methoden wie .send Erwarten Sie ein Byte-Objekt als zu sendende Daten, kein String-Objekt .

Da Sie ein Objekt vom Typ str haben und es an eine Funktion/Methode übergeben, die ein Objekt vom Typ bytes erwartet, wird ein Fehler ausgegeben, der Folgendes klar erklärt:

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

Daher wird die encode -Methode für Zeichenfolgen benötigt, die auf einen str -Wert angewendet wird und einen bytes -Wert zurückgibt:

>>> 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 das Präfix b in b'Hello world' bedeutet, dass dies tatsächlich ein Byte-Objekt ist. Sie können es dann an jede Funktion übergeben, die es erwartet, damit es reibungslos funktioniert.