2010-03-09 11 views
9

Estoy tratando de obtener un servidor básico (copiado de Beginning Python) para enviar un str.Python Socket Send Buffer vs. Str

El error:

c.send("XXX") 
TypeError: must be bytes or buffer, not str 

Parece que funciona cuando el decapado de un objeto. Todos los ejemplos que encontré, parecen ser capaces de enviar una cadena sin problemas.

Cualquier ayuda se agradece,

Stephen

import socket 
import pickle 

s = socket.socket() 

host = socket.gethostname() 

port = 80 

s.bind((host, port)) 

s.listen(5) 

while True: 
    c, addr = s.accept() 
    print("Got Connection From ", addr) 
    data = pickle.dumps(c) 
    c.send("XXX") 
    #c.send(data) 
    c.close() 
+7

tratar de sustituir ' "XXX"' 'por b "XXX"' si está utilizando Python 3.x – jfs

Respuesta

21

Parece intenta utilizar ejemplos de Python 2.x en Python 3 y se golpea una de las principales diferencias entre los versión de Python.

Para Python < 3 'cuerdas' son, de hecho, las cadenas binarias y 'objetos Unicode' son los objetos de texto adecuados (ya que pueden contener caracteres Unicode).

En Python 3 cadenas Unicode son las 'cuerdas regulares' (STR) y cadenas de bytes son objetos separados.

Bajo nivel de E/S se puede hacer sólo con datos (cadenas de bytes), no de texto (secuencia de caracteres). Para Python 2.x str también era del tipo 'datos binarios'. En Python 3 ya no existe y se debe usar uno de los objetos especiales de "datos". Los objetos se escabean a tales cadenas de bytes. Si desea ingresarlos manualmente en el código, use el prefijo "b" (b "XXX" en lugar de "XXX").

12

Para añadir a la respuesta de Jacek Konieczny: También se puede utilizar para obtener str.encode() bytes de una cadena. Si tiene la cadena en una variable en lugar de un literal, puede invocar codificar y devolverá una serie equivalente de bytes.