Python Socket 发送缓冲区与字符串
我正在尝试让一个基本的服务器(从《初学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()
2 个回答
12
补充一下Jacek Konieczny的回答:你还可以使用 str.encode() 来从字符串中获取字节。如果你的字符串存储在一个变量里,而不是直接写出来,你可以调用这个encode方法,它会返回一串对应的字节。
22
看起来你在用 Python 3 运行 Python 2.x 的例子,这让你遇到了这两个版本之间的一个主要区别。
在 Python 3 之前,'字符串'实际上是二进制字符串,而 'unicode 对象'才是正确的文本对象(因为它们可以包含任何 Unicode 字符)。
在 Python 3 中,unicode 字符串就是普通字符串(str),而字节字符串则是单独的对象。
低级别的输入输出只能处理数据(字节字符串),而不能处理文本(字符序列)。在 Python 2.x 中,str 也是一种 '二进制数据' 类型。但在 Python 3 中,它不再是这样了,应该使用一些特殊的 '数据' 对象。对象会被转换成这样的字节字符串。如果你想在代码中手动输入它们,记得在前面加上 "b" 前缀(比如用 b"XXX" 而不是 "XXX")。