2012-08-02 110 views
16

我試圖做一個簡單的客戶端&在python服務器消息傳遞程序,我不斷收到錯誤「TypeError:'str'不支持緩衝區接口」,不要真的甚至知道這意味着什麼。我大部分時間都是python的初學者,並且是一個網絡完整的初學者。TypeError:str不支持緩衝區接口

我出於某種原因假設我無法發送字符串數據?如果是這種情況,我會如何發送一個字符串?

僅供參考,我從Python 2中獲得的大部分代碼示例都是針對python 2.x的,我在Python 3中這樣做,所以我認爲這是從版本轉換中解決的另一個問題。我搜索了相同的問題,但無法真正解決如何將相同的修復應用於我的情況。

這裏的服務器開始代碼:

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

嘗試發送['StringIO.StringIO(data)'](http://docs.python.org/library/stringio.html)而不是'data'。 – 2012-08-02 16:15:53

+1

附註:如果數據在('q','Q'):' – gsk 2012-08-02 16:16:56

+2

@gsk:或'if data.lower()==「q」:' 。 – 2012-08-02 16:30:50

回答

54

在Python 3,字節串和unicode字符串現在有兩種不同的類型。 由於套接字不知道字符串編碼,因此它們使用原始字節字符串,它們與unicode字符串的接口略有不同。

所以,現在,只要你有一個你需要用作字節字符串的unicode字符串,你就需要encode()它。而當你有一個字節字符串,你需要decode它作爲一個普通的(python 2.x)字符串。

Unicode字符串是引號括起來的字符串。 字節串是b""封閉字符串

請參閱What's new in python 3.0

+2

你能給我多一點信息嗎?如果我使用str.encode(data) – Morgan 2012-08-02 16:51:49

+13

,當使用'client_socket.send(data)'時,將其替換爲'client_socket.send(data。編碼())'。當你使用'data = client_socket.recv(512)'得到數據時,用'data = client_socket.recv(512).decode()'取代它,你應該沒問題 – Scharron 2012-08-02 17:02:53

+0

非常感謝!我在第一次參加網絡編程時幫助過我。 – Morgan 2012-08-02 17:09:44

相關問題