Python Socket 发送缓冲区与字符串

9 投票
2 回答
25393 浏览
提问于 2025-04-15 20:13

我正在尝试让一个基本的服务器(从《初学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")。

撰写回答