web-dev-qa-db-fra.com

TypeError: un objet de type octet est requis, pas 'str'

Voici le code qui tente de modifier l'entrée fournie par un utilisateur à l'aide de sockets:

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

Lorsque je l'exécute et que je fournis des données, l'erreur suivante se produit:

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'

Que puis-je faire pour résoudre ce problème?

46
sri

Ce code est probablement bon pour Python 2. Mais dans Python 3, cela posera un problème, quelque chose lié au codage en bits. J'essayais de faire un simple serveur TCP et j'ai rencontré le même problème. L'encodage a fonctionné pour moi. Essayez ceci avec la commande sendto.

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

De même, vous utiliseriez .decode() pour recevoir les données côté serveur UDP, si vous souhaitez les imprimer exactement telles qu'elles ont été envoyées.

61
Umair47

L'encodage et le décodage peuvent résoudre ce problème dans Python 3:

Côté client:

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

Du côté serveur:

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

Un peu d’encodage peut résoudre ceci:

Côté client:

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

Du côté serveur:

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

Remplacez simplement le paramètre de message passé dans clientSocket.sendto(message,(serverName, serverPort)) à clientSocket.sendto(message.encode(),(serverName, serverPort)). Ensuite, vous courriez avec succès dans python

4
Abhijeet

Chaque fois que vous rencontrez une erreur avec ce message , utilisez my_string.encode().

(où my_string est la chaîne que vous passez à une fonction/méthode).

La méthode encode des objets str renvoie la version codée de la chaîne sous la forme d'un objet bytes que vous pouvez ensuite utiliser. Dans ce cas spécifique, les méthodes de socket telles que .send attendent un objet octet comme donnée à envoyer, n'est pas un objet chaîne .

Puisque vous avez un objet de type str et que vous le transmettez à une fonction/méthode qui attend un objet de type bytes, une erreur est générée et explique clairement que:

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

Donc, la méthode encode de chaînes est nécessaire, appliquée sur une valeur str et renvoyant une valeur 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"

Ici, le préfixe b dans b'Hello world' indique qu'il s'agit bien d'un objet octet. Vous pouvez ensuite le transmettre à la fonction qui l’attend pour que tout se passe bien.

1