2010-03-09 65 views
9

我想获得一个基本的服务器(从Python开始复制)发送一个str。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() 
+7

如果您使用的是Python 3.x,请尝试使用“b”XXX“替换”XXX“ – jfs 2010-03-09 19:25:37

回答

21

看来你尝试使用Python 2.x的例子在Python 3,你打的那些Python版本之间的主要区别之一。

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

在Python 3中,unicode字符串是'常规字符串'(str),而字节字符串是独立的对象。

低级I/O只能用数据(字节字符串)完成,而不能用文本(字符序列)完成。对于Python 2.x,str也是“二进制数据”类型。在Python 3中,它不再是特殊的“数据”对象之一。对象被腌制到这种字节串。如果您想在代码中手动输入它们,请使用“b”前缀(b“XXX”而不是“XXX”)。

12

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

相关问题