在 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 它们有效)请帮忙!谢谢!
最佳答案
你有几个问题。
socket.connect
不返回任何内容。它返回None
。你认为它返回一个conn, addr
的元组。 Python 试图通过迭代来解构返回到元组中的任何内容,您会收到错误消息:TypeError: 'NoneType' object is not iterable
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/