Python 3 socket int不支持缓冲区接口

时间:2016-12-21 04:06:02

标签: python-3.x sockets

我最近遇到了一些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

感谢您的回答。

1 个答案:

答案 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   字符串可以相当自由地相互交换(禁止   编码问题),字符串和字节现在完全分开了   概念。如果您传递的对象,则不会隐式进行编码/解码   错误的类型。字符串总是比较不等于字节或   字节数组对象。