我正在尝试使用基本服务器(从Beginning Python复制)发送str。
错误:
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()
答案 0 :(得分:22)
您似乎尝试在Python 3中使用Python 2.x示例,并且您遇到了这些Python版本之间的主要区别之一。
对于Python< 3'字符串'实际上是二进制字符串,'unicode对象'是正确的文本对象(因为它们可以包含任何Unicode字符)。
在Python 3中,unicode字符串是“常规字符串”(str),字节字符串是单独的对象。
低级I / O只能用数据(字节串)而不是文本(字符序列)来完成。对于Python 2.x str也是'二进制数据'类型。在Python 3中它不再是,应该使用一个特殊的“数据”对象。对象被腌制为这样的字节串。如果您想在代码中手动输入,请使用“b”前缀(b“XXX”而不是“XXX”)。
答案 1 :(得分:12)
添加到Jacek Konieczny的答案:您还可以使用str.encode()从字符串中获取字节。如果你有一个变量而不是文字的字符串,你可以调用encode,它将返回一个等效的字节序列。