2015-10-07 13 views
27

Il seguente è il codice che tenta di modificare il segnale fornito da un utente utilizzando prese:TypeError: è necessario un oggetto bytes simile, non '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() 

Quando eseguire e di alimentazione in ingresso si verifica il seguente errore:

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' 

Cosa posso fare per risolvere questo?

+4

Il primo argomento ('messaggio') deve essere byte, ma si passa una stringa. Dovresti codificarlo prima di inviare, ad es. 'Messaggio.encode ('utf-8') ' – mgilson

+0

ma la cosa è ho bisogno di passare stringa al server non byte – sri

+0

dalla presa import * serverName = 'hostname' serverPort = 12000 clientSocket = socket (AF_INET, SOCK_DGRAM) messaggio = input ('Immettere la frase minuscola:') message.encode ('utf-8') clientSocket.sendto (messaggio, (serverName, serverPort)) modifiedMessage, serverAddress = clientSocket.recvfrom (2048) stampa (modifiedMessage) clientSocket.close() – sri

risposta

45

Questo codice è probabilmente buono per Python 2. Ma in Python 3, ciò causerà un problema, qualcosa legato alla codifica dei bit. Stavo cercando di creare un semplice server TCP e ho riscontrato lo stesso problema. La codifica ha funzionato per me. Prova questo con il comando sendto.

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

Allo stesso modo si usa .decode() per ricevere i dati sul lato server UDP, se si desidera stampare esattamente come è stato inviato.

+0

la codifica e la decodifica su entrambi i lati della connessione aumentano la latenza? Se così fosse python2 sarebbe effettivamente più veloce nell'invio dei dati rispetto a python3 – Max

+0

A mio parere, ciò non influirà sulle prestazioni come la latenza, ecc. Tuttavia, non ho provato a sperimentarlo personalmente, quindi non posso esserne sicuro. – Umair47

6

Un po 'di codifica in grado di risolvere questo:

lato client:

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

Server Side:

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

Il tuo client non funzionerà: sendto richiede 3 parametri, il messaggio l'indirizzo del server e la porta relativa – dlewin

+0

@dlewin Hai ragione, buona cattura. L'ho aggiornato – Wlliam

3

Basta sostituire il parametro messaggio passato in clientSocket.sendto(message,(serverName, serverPort))-clientSocket.sendto(message.encode(),(serverName, serverPort)). Poi si sarebbe eseguito con successo in in python3

0

Ogni volta che si verifica un errore con questo messaggio uso my_string.encode().

(dove my_string è la stringa che si sta passando a una funzione/metodo).

Il metodo di str oggetti encode restituisce la versione codificata della stringa come bytes object, che è quindi possibile utilizzare. In questa istanza specifica, i metodi socket such as .sendprevedono un oggetto byte come i dati da inviare, non un oggetto stringa.

Dal momento che si dispone di un oggetto di tipo str e si sta passando ad una funzione/metodo che si aspetta un oggetto di tipo bytes, viene generato un errore che spiega chiaramente che:

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

Così il encode è necessario il metodo di stringhe, applicato su un valore str e restituire un valore 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" 

Qui il prefisso b in b'Hello world' indica che questo è effettivamente un oggetto bytes. È quindi possibile passarlo a qualsiasi funzione lo si aspetti in modo che funzioni senza intoppi.

Problemi correlati