it-swarm.asia

TypeError: كائن يشبه بايت مطلوب ، وليس '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()

عندما أقوم بتنفيذه وإدخال الإدخال ، يحدث الخطأ التالي:

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'

ماذا يمكنني أن أفعل لحل هذا؟

46
sri

من المحتمل أن يكون هذا الرمز جيدًا لـ Python 2. لكن في Python 3 ، سيؤدي ذلك إلى حدوث مشكلة تتعلق بتشفير البت. كنت أحاول إنشاء بسيط TCP الخادم واجه نفس المشكلة. عمل الترميز من أجلك. جرب هذا باستخدام sendto الأمر.

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

وبالمثل ، ستستخدم .decode() لتلقي البيانات من جانب خادم UDP ، إذا كنت ترغب في طباعتها تمامًا كما تم إرسالها.

61
Umair47

الترميز وفك التشفير يمكن أن يحل هذا في Python 3:

جانب العميل:

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

جانب الخادم:

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

القليل من الترميز يمكن أن يحل هذا:

جانب العميل:

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

جانب الخادم:

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

ببساطة قم باستبدال معلمة الرسالة التي تم تمريرها في clientSocket.sendto(message,(serverName, serverPort)) إلى clientSocket.sendto(message.encode(),(serverName, serverPort)). ثم يمكنك تشغيل بنجاح في python

4
Abhijeet

كلما واجهت خطأ في هذه الرسالة استخدم my_string.encode().

(أين my_string هي السلسلة التي تمررها إلى دالة/طريقة).

تُرجع طريقة encode للكائنات str الكائنات النسخة المشفرة من السلسلة كـ bytes object والتي يمكنك استخدامها بعد ذلك. في هذه الحالة بالذات ، طرق المقبس مثل .send تتوقع كائن بايت كما سيتم إرسال البيانات ، ليس كائن سلسلة .

نظرًا لأن لديك كائنًا من النوع str وأنت تمرره إلى دالة/طريقة تتوقع كائنًا من النوع bytes ، يتم رفع خطأ يوضح بوضوح ما يلي:

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

لذلك _ encode طريقة السلاسل مطلوبة ، تطبق على str قيمة وإرجاع bytes قيمة:

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

هنا البادئة b في b'Hello world' يدل على أن هذا هو في الواقع كائن بايت. يمكنك بعد ذلك تمريرها إلى أي وظيفة تتوقعها حتى تعمل بسلاسة.

1
Jim Fasarakis Hilliard