2012-08-02 10 views
16

Estoy tratando de hacer un simple cliente & programa de mensajes del servidor en python, y sigo obteniendo el error "TypeError: 'str' no admite la interfaz del buffer" y no realmente sé lo que eso significa. Soy un principiante con Python en su mayor parte, y un principiante completo con redes.TypeError: str no es compatible con la interfaz del buffer

Supongo que por alguna razón no puedo enviar datos de cadena? Si este es el caso, ¿cómo enviaría una cadena?

Como referencia, el código de ejemplo del que obtuve la mayoría de esto fue para Python 2.x, y estoy haciendo esto en Python 3, así que creo que es otro inconveniente el que se resuelva desde la transición de versión. He buscado el mismo problema pero no puedo encontrar la forma de aplicar las mismas soluciones a mi situación.

Aquí está el código de inicio para el servidor:

import socket 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.bind(("", 5000)) 
server_socket.listen(5) 

print("TCP Server Waiting for client on port 5000") 

while 1: 
    client_socket, address = server_socket.accept() 
    print("TCP Server received connect from: " + str(address)) 
    while 1: 
     data = input("SEND(Type q or Q to quit):") 
     if(data == 'Q' or data == 'q'): 
      client_socket.send(data) 
      client_socket.close() 
      break; 
     else: 
      client_socket.send(data) 
      data = client_socket.recv(512) 

     if(data == 'q' or data == 'Q'): 
      client_socket.close() 
      break; 
     else: 
      print("Received: " + data) 
+2

Intente enviar ['StringIO.StringIO (data)'] (http://docs.python.org/library/stringio.html) en lugar de simplemente 'data'. –

+1

Como nota al margen: puede simplificar sus sentencias if de la siguiente manera 'if data in ('q', 'Q'):' – gsk

+2

@gsk: O 'if data.lower() ==" q ":' . –

Respuesta

54

en Python 3, los bytes cuerdas y cadenas Unicode son ahora dos tipos diferentes. Dado que los sockets no tienen conocimiento de las codificaciones de cadenas, están usando cadenas de bytes sin procesar, que tienen una interfaz ligeramente diferente de las cadenas de unicode.

Por lo tanto, ahora, cada vez que tenga una cadena Unicode que necesita utilizar como una cadena de bytes, necesita encode(). Y cuando tiene una cadena de bytes, necesita decode para usarla como cadena normal (python 2.x).

Las cadenas Unicode son comillas incluidas. Las cadenas de bytes son b"" cadenas incluidas

Ver What's new in python 3.0.

+2

¿Me puede dar un poco más de información? encoded (data) no es reconocido por python, y sigo teniendo el mismo error si uso str.encode (data) – Morgan

+13

Cuando usa 'client_socket.send (data)', reemplácelo por 'client_socket.send (data. codificar()) '. Cuando obtiene datos usando 'data = client_socket.recv (512)', reemplácelos por 'data = client_socket.recv (512) .decode()' y debería estar bien – Scharron

+0

¡Muchas gracias! Me has ayudado en mi primera incursión en la programación en red. – Morgan

Cuestiones relacionadas