我最近遇到了一些python变量影响的麻烦。我用不同的类型影响了同一个变量。例如:
hello = 1
print(hello)
hello = "Hello"
print(hello)
输出符合我的预期:它会显示1
,然后显示hello
。
但是我的echo服务器测试脚本有问题:
skt_o = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
skt_o.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
skt_o.bind(('', 7777))
skt_o.listen(1)
lst_skt = []
while(1):
lst, _, _ = select.select(lst_skt+[skt_o], [], [])
for s in lst:
if(s == skt_o):
skt, _ = s.accept()
lst_skt.append(skt)
else:
res = s.recv(1500)
if(len(dat) == 0):
print("[R-Close] %s" % s)
s.close()
lst_skt.remove(s)
break
for c in lst_skt:
if(c != s):
res = c.send(res)
我使用nc localhost 7777
将两个终端连接到监听端口。当我发送消息时,一切都按预期工作。两个终端可以通信。但是当我启动第三个终端并尝试发送消息时,我得到一个TypeError
(int不支持缓冲区接口)。
如果我替换res
变量,如下所示,一切正常。我可以连接三个或更多可以通信的终端:
dat = s.recv(1500)
if(len(dat) == 0):
print("[R-Close] %s" % s)
s.close()
lst_skt.remove(s)
break
for c in lst_skt:
if(c != s):
res = c.send(dat)
第一个echo脚本有什么问题?
我知道问题来自这一行:
res = c.send(res)
但我无法解释原因。
nb:我使用Python 3.4.2
感谢您的回答。
答案 0 :(得分:1)
这是因为在python 3.4.x中,套接字对象的send方法接受“ 字节 ”序列类型作为参数。因此,您需要使用带有常规字符串语法b'python'
的 'b'前缀 ,将要传递的参数转换为字节。这会将字符串python
转换为字节序列类型。
因此,在您的代码中,您需要将要传递的资源转换为send方法的字节。
在您的代码中使用类似这样的内容。 res = c.send(b'some-string-or-integer')
请通过以下链接查看有关内置类型的Python文档,第5.6节:
https://docs.python.org/3.1/library/stdtypes.html
也来自python文档。...
此外,在以前的Python版本中,字节字符串和Unicode 字符串可以相当自由地相互交换(禁止 编码问题),字符串和字节现在完全分开了 概念。如果您传递的对象,则不会隐式进行编码/解码 错误的类型。字符串总是比较不等于字节或 字节数组对象。