web-dev-qa-db-ja.com

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'Hello world'の接頭辞bは、これが実際にバイトオブジェクトであることを示しています。その後、スムーズに実行するために、それを期待している関数に渡すことができます。