2012-08-02 4 views
16

Je suis en train de faire un client simple programme de messagerie serveur & en python, et je reçois toujours l'erreur "TypeError: 'str' ne supporte pas l'interface tampon" et ne pas vraiment même savoir ce que cela signifie. Je suis un débutant avec python pour la plupart, et un débutant complet avec le réseautage.TypeError: str ne prend pas en charge l'interface tampon

Je suppose que pour une raison quelconque, je ne peux pas envoyer de données de chaîne? Si c'est le cas, comment envoyer une chaîne? Pour référence, l'exemple de code dont j'ai tiré la plus grande partie était pour python 2.x, et je le fais en Python 3, donc je crois que c'est un autre problème à résoudre à partir de la transition de version. J'ai cherché autour pour le même problème, mais ne peux pas vraiment travailler comment appliquer les mêmes corrections à ma situation.

Voici le code à partir du serveur:

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

Essayez d'envoyer ['StringIO.StringIO (data)'] (http://docs.python.org/library/stringio.html) au lieu de simplement 'data'. –

+1

En note: vous pouvez simplifier vos if-statements comme suit 'si les données dans ('q', 'Q'):' – gsk

+2

@gsk: Ou 'si data.lower() ==" q ":' . –

Répondre

54

En python 3, octets chaînes et les chaînes unicode sont maintenant deux types différents. Comme les sockets ne sont pas conscients des encodages de chaînes, ils utilisent des chaînes de type raw bytes, qui ont une interface légèrement différente des chaînes Unicode. Donc, maintenant, chaque fois que vous avez une chaîne unicode que vous devez utiliser comme une chaîne d'octets, vous devez encode(). Et quand vous avez une chaîne d'octets, vous devez l'utiliser comme une chaîne normale (python 2.x).

Les chaînes Unicode sont des chaînes entre guillemets. Les chaînes d'octets sont des chaînes b"" fermées

Voir What's new in python 3.0.

+2

Pouvez-vous me donner un peu plus d'infos? encoder (data) n'est pas reconnu par python, et j'obtiens toujours la même erreur si j'utilise str.encode (data) – Morgan

+13

Lorsque vous utilisez 'client_socket.send (data)', remplacez le par 'client_socket.send (data. encoder()) '. Lorsque vous obtenez des données en utilisant 'data = client_socket.recv (512)', remplacez-le par 'data = client_socket.recv (512) .decode()' et vous devriez être bien – Scharron

+0

Merci beaucoup! Vous m'avez aidé lors de ma première incursion dans la programmation en réseau. – Morgan

Questions connexes