TypeError:'str'不支持3.4.1中的缓冲区接口

时间:2014-09-13 19:00:21

标签: python python-3.x

我用Python创建了一个服务器。代码是:

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.

在Stackoverflow上扫描类似查询后,我发现从Python 3.0开始,数据需要转换为字节。如果是这种情况,那么我应该在何处以及如何更改/解析数据?

2 个答案:

答案 0 :(得分:2)

您在文本模式中打开了文件,这意味着内容被解码为unicode字符串。

写入套接字时,需要编写bytes。您可以通过以二进制模式打开文件来轻松获取文件中的字节:

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

请注意,我一次性将数据发送到套接字; ;这里不需要逐字节发送数据。

答案 1 :(得分:0)

方法send()接受binnary格式的参数。因此,尝试使用方法编码('utf-8')将一些数据发送到服务器:

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

并使用decode('utf-8')从方法recv()返回的数据中获取字符串。