python - TypeError: বাইট-এর মতো অবজেক্ট প্রয়োজন, 'স্ট্র' নয়




python-3.x sockets (4)

এনকোডিং এবং ডিকোডিংটি পাইথন 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'
>>>

নিম্নলিখিত কোডটি যা কোনও ব্যবহারকারী দ্বারা সকেট ব্যবহার করে সরবরাহ করা ইনপুটটি সংশোধন করার চেষ্টা করে:

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'

এটি সমাধান করার জন্য আমি কী করতে পারি?


কিছুটা এনকোডিং এটি সমাধান করতে পারে:

মক্কেলের পক্ষে:

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

সার্ভার সাইড:

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

যখনই আপনি এই বার্তায় কোনও ত্রুটির মুখোমুখি হন my_string.encode() ব্যবহার করুন

(যেখানে my_string স্ট্রিংটি আপনি কোনও ফাংশন / পদ্ধতিতে my_string সেই স্ট্রিং)।

str অবজেক্টগুলির encode পদ্ধতি স্ট্রিংয়ের এনকোড সংস্করণটিকে bytes অবজেক্ট হিসাবে ফিরিয়ে দেয় যা আপনি bytes পরে ব্যবহার করতে পারেন। এই নির্দিষ্ট উদাহরণে, সকেট পদ্ধতি যেমন .send কোনও স্ট্রিং অবজেক্ট নয় , ডেটা প্রেরণের হিসাবে বাইট অবজেক্টের প্রত্যাশা করে

যেহেতু আপনার কাছে str টাইপের একটি অবজেক্ট রয়েছে এবং আপনি এটিকে কোনও ফাংশন / পদ্ধতিতে পাঠাচ্ছেন যা কোনও ধরণের bytes কোনও বস্তুর প্রত্যাশা করে, তাই একটি ত্রুটি উত্থাপিত হয় যা স্পষ্টভাবে ব্যাখ্যা করে:

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

সুতরাং স্ট্রিংগুলির encode পদ্ধতিটি প্রয়োজন, একটি স্ট্রিংয়ের encode প্রয়োগ করা হয় এবং একটি 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'Hello world' এর উপসর্গটি বোঝায় যে এটি সত্যই একটি বাইট অবজেক্ট। তারপরে এটি কার্যকরভাবে চালুর জন্য আপনি যে কোনও ক্রিয়াকলাপটি প্রত্যাশা করছেন তা এটি পাস করতে পারেন।


clientSocket.sendto(message,(serverName, serverPort)) পাস করা বার্তা প্যারামিটারটি কেবল clientSocket.sendto(message,(serverName, serverPort)) clientSocket.sendto(message.encode(),(serverName, serverPort)) । তারপরে আপনি সাফল্যের সাথে অজগর 3 তে চালাবেন







sockets