9

我正在尝试获取一个基本服务器(从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()
4

2 回答 2

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”)。

于 2010-03-09T19:36:34.087 回答
12

要添加到 Jacek Konieczny 的答案:您还可以使用str.encode()从字符串中获取字节。如果您将字符串放在变量中而不是文字中,则可以调用 encode ,它将返回等效的字节序列。

于 2010-03-09T19:54:27.357 回答