2012-08-02 20 views
16

Ich versuche, einen einfachen Client & Server Messaging-Programm in Python zu machen, und ich bekomme immer den Fehler "TypeError: 'Str' unterstützt nicht die Pufferschnittstelle" und nicht Ich weiß wirklich, was das bedeutet. Ich bin ein Anfänger mit Python zum größten Teil und ein kompletter Anfänger mit Vernetzung.TypeError: str unterstützt keine Pufferschnittstelle

Ich nehme an, aus irgendeinem Grund kann ich keine String-Daten senden? Wenn dies der Fall ist, wie würde ich eine Zeichenfolge senden?

Als Referenz, der Beispielcode, von dem ich am meisten bekam, war für Python 2.x, und ich mache das in Python 3, also glaube ich, dass es ein weiterer Knick ist, aus Versionsübergängen herauszuarbeiten. Ich habe nach dem gleichen Problem gesucht, kann aber nicht wirklich herausfinden, wie ich die gleichen Korrekturen auf meine Situation anwenden kann.

Hier ist der Anfang Code für den Server:

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

Versuchen Sie, ['StringIO.StringIO (data)'] (http://docs.python.org/library/stringio.html) anstatt nur 'data' zu senden. –

+1

Als eine Randnotiz: Sie können Ihre if-Anweisungen wie folgt vereinfachen 'wenn Daten in ('q', 'Q'):' – gsk

+2

@ gsk: Oder 'wenn data.lower() ==" q ":' . –

Antwort

54

In Python 3, Byte-Strings und Unicode-Strings sind nun zwei verschiedene Typen. Da Sockets keine Zeichenfolgencodierungen kennen, verwenden sie rohe Bytezeichenfolgen, die eine etwas andere Schnittstelle als Unicodezeichenfolgen haben.

So, jetzt, wenn Sie eine Unicode-Zeichenfolge haben, die Sie als Byte-Zeichenfolge verwenden müssen, müssen Sie encode() es. Und wenn Sie eine Byte-Zeichenfolge haben, müssen Sie decode es als eine reguläre (Python 2.x) Zeichenfolge verwenden.

Unicode-Zeichenfolgen sind in Anführungszeichen eingeschlossene Zeichenfolgen. Bytes Zeichenketten sind b"" beiliegende Zeichenketten

Siehe What's new in python 3.0.

+2

Können Sie mir ein wenig mehr Informationen geben? encode (Daten) wird von Python nicht erkannt, und ich bekomme immer noch den gleichen Fehler, wenn ich str.encode (data) verwende – Morgan

+13

Wenn Sie 'client_socket.send (data)' verwenden, ersetzen Sie es durch 'client_socket.send (data. encode()) '. Wenn Sie Daten mit 'data = client_socket.recv (512)' erhalten, ersetzen Sie sie durch 'data = client_socket.recv (512) .decode()' und Sie sollten in Ordnung sein – Scharron

+0

Vielen Dank! Sie haben mir bei meinem ersten Ausflug in die vernetzte Programmierung geholfen. – Morgan

Verwandte Themen