【问题标题】:TypeError: 'str' does not support the buffer interface in 3.4.1 [duplicate]TypeError:'str'不支持3.4.1中的缓冲区接口[重复]
【发布时间】:2014-09-13 19:00:20
【问题描述】:

我已经用 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 开始,数据需要转换为字节。如果是这种情况,那么我应该在哪里以及如何更改/解析数据?

【问题讨论】:

  • 所有其他问题都说明您需要将数据从字符串编码为字节。您是否尝试过应用它?当你这样做时出了什么问题?
  • @MartijnPieters 我不知道该怎么做。这是我第一次使用 Python。
  • Best way to convert string to bytes in Python 3?,但在这种情况下以二进制模式打开文件更容易。
  • @MartijnPieters 所以,我应该这样做:outputBin = bytes(outputdata,"utf-8") 然后发送 outputBin?
  • 我已经在下面回答了你应该做什么。

标签: python python-3.x


【解决方案1】:

您以文本模式打开文件,这意味着内容被解码为 un​​icode 字符串。

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

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

请注意,我将数据发送到套接字一次性;此处无需逐字节发送数据。

【讨论】:

    【解决方案2】:

    方法 send() 接受二进制格式的参数。所以尝试使用方法 encode('utf-8') 向服务器发送一些数据:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2011-07-25
      • 2014-08-09
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多