gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:19:01 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com