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?
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.
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'
>>>
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'))
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
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.