2014-09-13 62 views
1

我已經在Python中創建了一個服務器。代碼是:TypeError:'str'不支持3.4.1中的緩衝區接口

from socket import * 
serverSocket = socket(AF_INET, SOCK_STREAM) 
localHost = # my address 
port = 5369 
serverSocket.bind((localHost, port)) 
serverSocket.listen(1) 

while True: 
    print ("Ready to serve.....") 
    connectionSocket, addr = serverSocket.accept() 

try: 
    message = connectionSocket.recv(1024) 
    filename = message.split()[1] 
    f = open(filename[1:]) 
    outputdata = f.read() 

    for i in range(0, len(outputdata)): 
     connectionSocket.send(outputdata[i]) 

    connectionSocket.close() 

except IOError: 
    connectionSocket.send('404 Not Found') 

connectionSocket.close() 
serverSocket.close() 

我執行了該文件。它給出了一個錯誤:

Traceback (most recent call last): 
    File:"D;\.....\server.py", line 25, in <module> 
    connectionSocket.send(outputdata[i]) 
TypeError: 'str' does not support the buffer interface. 

通過類似的查詢#1掃描後,我發現,在Python 3.0,需要將數據轉換成字節。如果是這樣的話,那麼我應該在哪裏以及如何更改/解析數據?

+0

所有其他問題都解釋說您需要將數據從字符串編碼爲字節。你有沒有嘗試應用?你做什麼錯了? – 2014-09-13 19:12:49

+0

@MartijnPieters我不知道該怎麼做。這是我第一次使用Python。 – user2607744 2014-09-13 19:15:44

+0

請參閱[在Python 3中將字符串轉換爲字節的最佳方式](http://stackoverflow.com/q/7585435),但在這種情況下,以二進制模式打開文件更容易。 – 2014-09-13 19:18:03

回答

2

您在文本模式下打開文件,這表示內容被解碼爲unicode字符串。

寫入套接字時,您需要改寫bytes。您可以輕鬆地在二進制模式,而不是打開它得到一個文件的字節:

with open(filename[1:], 'rb') as f: 
    connectionSocket.send(f.read()) 

請注意,我將數據發送到插座在一個去;無需在此處逐字節地發送數據。

0

send()方法接受二進制格式的參數。因此,嘗試使用方法編碼(「UTF-8」)的一些數據發送到服務器:

connectionSocket.send(outputdata[i].encode('utf-8')) 

並使用解碼(「UTF-8」),從該法的recv()返回的數據得到的字符串。

相關問題