2012-08-02 12 views
16

Próbuję utworzyć prosty program do obsługi wiadomości dla klienta & w pythonie, i ciągle otrzymuję komunikat "TypeError:" str 'nie obsługuje interfejsu bufora "i nie naprawdę nawet wiem, co to znaczy. W większości jestem początkującym użytkownikiem Pythona i kompletnym początkującym z siecią.TypeError: str nie obsługuje interfejsu buforowego

Jestem zakładając z jakiegoś powodu nie może wysyłać dane ciąg? Jeśli tak, to w jaki sposób wysłać ciąg?

Dla przykładu przykładowy kod, w którym mam większość tego, był dla Pythona 2.x, i robię to w Pythonie 3, wierzę więc, że to kolejne załamanie do przejścia z wersji przejścia. Szukałem tego samego problemu, ale nie mogę się dowiedzieć, jak zastosować te same poprawki do mojej sytuacji.

Oto kod rozpoczynający serwera:

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

Spróbuj wysłać ['StringIO.StringIO (dane)'] (http://docs.python.org/library/stringio.html) zamiast tylko 'danych'. –

+1

Na marginesie: możesz uprościć instrukcje if w następujący sposób: 'jeśli dane w ('q', 'Q'):' – gsk

+2

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

Odpowiedz

54

W Pythonie 3, ciągi bajtów i ciągi Unicode są teraz dwa różne typy. Ponieważ gniazda nie są świadome kodowania ciągów, używają one ciągów raw bytes, które mają nieco inny interfejs niż łańcuchy Unicode.

Tak więc, teraz, gdy masz ciąg znaków Unicode, który musisz użyć jako ciąg bajtów, musisz encode() go. A jeśli masz ciąg bajtów, musisz go używać jako zwykłego (python 2.x) łańcucha.

Łańcuchy Unicode są cytatami zamkniętych ciągów. Struny Bajty to b"" załączone ciągi:

Zobacz What's new in python 3.0.

+2

Czy możesz podać mi trochę więcej informacji? encode (data) nie jest rozpoznawany przez Pythona i nadal otrzymuję ten sam błąd, jeśli używam str.encode (dane) – Morgan

+13

Kiedy używasz 'client_socket.send (dane)', zamień go na 'client_socket.send (data. encode()) '. Kiedy otrzymasz dane za pomocą 'data = client_socket.recv (512)', zastąp go 'data = client_socket.recv (512) .decode()' i powinieneś być w porządku – Scharron

+0

Dziękuję bardzo! Pomogłeś mi w mojej pierwszej drodze do programowania sieciowego. – Morgan

Powiązane problemy