类型错误:字符串不支持缓冲区接口

17

我正在尝试用Python制作一个简单的客户端和服务器消息程序,但我一直收到“TypeError: 'str' does not support the buffer interface”的错误,而且我甚至不知道这意味着什么。对于大部分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)

2
尝试发送StringIO.StringIO(data),而不是只发送 data - Andrew Clark
1
顺便提一下:您可以将if语句简化如下 if data in ('q', 'Q'): - gsk
2
@gsk:或者 if data.lower() == "q": - Tim Pietzcker
2
@gsk:不,那也会返回True给data = ""或者data = "qQ"。 - Tim Pietzcker
3
@Morgan,为什么?我标记它是因为当人们正在寻找解决方案时,看到其他帖子的答案也可能有所帮助。我认为重复的问题也应该合并。 - nbro
显示剩余3条评论
1个回答

54

在Python 3中,字节字符串和Unicode字符串是两种不同的类型。由于套接字不了解字符串编码,它们使用原始的字节字符串,它们与 Unicode 字符串具有稍微不同的接口。

因此,现在,每当您需要使用 Unicode 字符串作为字节字符串时,您需要对其进行 encode()。而当您有一个字节字符串时,需要 decode() 它才能将其用作常规(Python 2.x)字符串。

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

请参见Python 3.0 中的新特性


2
你能给我更多的信息吗?在Python中无法识别encode(data),如果我使用str.encode(data),仍然会得到相同的错误。 - Morgan
14
client_socket.send(data) 替换为 client_socket.send(data.encode())。将获取数据的语句 data = client_socket.recv(512) 替换为 data = client_socket.recv(512).decode(),这样就可以了。注意不要改变原文意思,使翻译更易懂。 - Scharron
非常感谢!你在我第一次涉足网络编程中帮了我。 - Morgan
2
不用谢,我喜欢看到人们转向Python3 ;-) - Scharron
2
关于 encode() 和 decode() 以及何时使用它们,我发现这个 PyCon 2012 的演讲非常有帮助:http://nedbatchelder.com/text/unipain.html - Bob Van Zant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接