Python套接字发送缓冲区与Str的区别

9
我正在尝试让一个基本的服务器(从Beginning Python复制)发送一个字符串。
错误信息:
c.send( "XXX" )
TypeError: must be bytes or buffer, not str

似乎在对对象进行腌制时是有效的。我找到的所有示例都可以轻松发送字符串。
任何帮助将不胜感激,
斯蒂芬
import socket  
import pickle  

s = socket.socket()

host = socket.gethostname()

port = 80

s.bind((host, port))

s.listen(5)

while True:  
    c, addr = s.accept()  
    print( "Got Connection From ", addr )  
    data = pickle.dumps(c)  
    c.send( "XXX" )  
    #c.send(data)  
    c.close()

7
如果你正在使用Python 3.x,尝试用b"XXX"替换"XXX" - jfs
2个回答

22

似乎您在Python 3中尝试使用Python 2.x示例,而且你遇到了这两个版本之间的主要区别之一。

对于Python < 3来说,“字符串”实际上是二进制字符串,而“Unicode对象”是正确的文本对象(因为它们可以包含任何Unicode字符)。

在Python 3中,Unicode字符串是“常规字符串”(str),而字节字符串是单独的对象。

低级I/O仅能处理数据(字节字符串),而不能处理文本(字符序列)。对于Python 2.x,str也是“二进制数据”类型。在Python 3中,它不再是如此,应该使用其中一个特殊的“数据”对象。对象被封送成这样的字节字符串。如果您想手动输入代码,请使用“b”前缀(b“XXX”而不是“XXX”)。


12

除了Jacek Konieczny的回答外,您也可以使用str.encode()将字符串转换为字节。如果您有一个变量中的字符串而不是文字字符串,您可以调用encode函数它将返回一个等效的字节序列。


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