【问题标题】:TypeError: str does not support buffer interface [duplicate]TypeError:str不支持缓冲区接口[重复]
【发布时间】:2012-07-31 16:06:07
【问题描述】:

我正在尝试在 python 中制作一个简单的客户端和服务器消息传递程序,但我不断收到错误“TypeError:'str'不支持缓冲区接口”,甚至不知道这是什么意思。我在很大程度上是 python 的初学者,也是网络的完全初学者。

我假设由于某种原因我无法发送字符串数据?如果是这种情况,我将如何发送字符串?

作为参考,我从中获得的大部分示例代码是针对 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)

【问题讨论】:

  • 尝试发送StringIO.StringIO(data) 而不仅仅是data
  • 附带说明:您可以将 if 语句简化如下if data in ('q', 'Q'):
  • @gsk:或if data.lower() == "q":
  • @gsk:不,对于data = ""data = "qQ",这也会返回True
  • @Morgan 是的,为什么?我标记它是因为当人们在寻找解决您问题的方法时,查看其他帖子的答案也可能会有所帮助。我也认为应该合并重复的问题。

标签: python


【解决方案1】:

在 python 3 中,字节字符串和 unicode 字符串现在是两种不同的类型。 由于套接字不知道字符串编码,它们使用的是原始字节字符串,其接口与 unicode 字符串略有不同。

所以,现在,只要您有一个需要用作字节字符串的 unicode 字符串,您就需要encode() 它。而当你有一个字节字符串时,你需要decode它来使用它作为一个普通的(python 2.x)字符串。

Unicode 字符串是用引号括起来的字符串。 字节字符串是b"" 封闭字符串

What's new in python 3.0

【讨论】:

  • 你能给我更多的信息吗?编码(数据)不被python识别,如果我使用str.encode(数据),我仍然会得到同样的错误
  • 当您使用client_socket.send(data) 时,将其替换为client_socket.send(data.encode())。当你使用data = client_socket.recv(512) 获取数据时,将其替换为data = client_socket.recv(512).decode() 就可以了
  • 非常感谢!在我第一次涉足网络编程方面,您帮助了我。
  • 不客气,我喜欢人们迁移到 python3 ;-)
  • 关于 encode() 和 decode() 以及何时做我发现这个 pycon 2012 谈话非常有帮助:nedbatchelder.com/text/unipain.html
猜你喜欢
  • 2016-04-28
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
相关资源
最近更新 更多