python - 你可以使用 python 套接字进行 docker 容器通信吗?

标签 python python-3.x sockets docker networking

在 docker 网络中,我尝试使用 python 套接字(发送数据包)在两个容器之间进行通信。 Ping 有效,但 python 套接字库不起作用。

错误:

第 6 行:conn, addr = sock.connect(('172.168.1.2', 4000)) TypeError: 'NoneType' 对象不可迭代

首先在container1中运行python3 receive.py。然后 python3 send.py 在容器 2 中运行。容器 1 打印“已接受”,然后什么也没有。如上所述的容器 2 错误。

这个网络是一个用户定义的网络,有自己的子网和默认网关。当我使用它连接到我的树莓派时,使用完全相同的代码不会发生此错误,但容器通信会出错。

所有代码:

容器 1:

import socket

def receive():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(("", 4000))
        s.listen(2)
        conn, addr = s.accept()
        print("accepted")
        print(bytes.decode(conn.recv(1024)))

容器 2:

import socket

def send():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        command = "bridge test!"
        conn, addr = sock.connect(('172.168.1.2', 4000))
        conn.sendall(command)

设置网络:

docker network create --subnet 172.168.1.0/24 testNetwork
docker network connect testNetwork container1
docker network connect testNetwork container2

我从 docker inspect 获得了容器的 IP 地址(加上 ping 它们有效)请帮忙!谢谢!

最佳答案

你有几个问题。

  1. socket.connect 不返回任何内容。它返回 None。你认为它返回一个 conn, addr 的元组。 Python 试图通过迭代来解构返回到元组中的任何内容,您会收到错误消息:

    TypeError: 'NoneType' object is not iterable
    
  2. socket.sendall 接受字节而不是 str。转换方式

    sock.sendall(command.encode())
    

这是固定的 send.py:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
command = "bridge test!"
x, y = sock.connect(('172.168.1.2', 4000))
sock.sendall(command.encode())

关于python - 你可以使用 python 套接字进行 docker 容器通信吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50360680/

相关文章:

python - 如何合并pandas中的重复行

python - 在 __new__ 中使用 object.__new__ 有什么缺点?

python - 如何将Python中的模块导入到既用作 __main__ 又由不同目录中的文件导入的文件中?

java - 无法在 ...\PushServer\target\Push-Server-0.12.0-capsule-fat.jar 中找到 Premain-Class list 属性

java - 将 Spark 流输出写入套接字

python - 帮助使大的子图看起来更好更清晰

python - 通过更改 'Values' 参数生成透视 Pandas 数据帧

python3 datetime.datetime.strftime 无法接受 utf-8 字符串格式

Python 模块(分配前引用的模块名称)

java - 如何解码 Teltonika FM1000 设备。此设备的解码器格式是什么