0

我正在尝试通过 ZeroMQ 在 ac#(5.0) 和 python (3.9) 应用程序之间进行通信。对于.Net,我使用 NetMQ 和 python PyZMQ。

只要两个应用程序使用相同的语言,我就可以毫无问题地进行通信

  • c# 应用程序到 c# 应用程序;
  • 蟒蛇->蟒蛇;
  • 爪哇->爪哇,

但是当我尝试在不同语言之间建立联系时,麻烦就开始了。

  • java -> c# 和 reverse 也可以正常工作[编辑]

我没有收到任何错误,但它也不起作用。

我首先尝试了PUB-SUBArchetype 模式,但由于它不起作用,所以我尝试了,所以仍然可以在代码中找到“PUB-SUB”版本REQ-REP的一些剩余部分。

我的 Python 代码如下所示:

def run(monitor: bool):
loop_counter: int = 0

context = zmq.Context()
# socket = context.socket(zmq.PUB)
# socket.bind("tcp://*:5557")
socket = context.socket(zmq.REP)
socket.connect("tcp://localhost:5557")

if monitor:
    print("Connecting")

# 0 = Longest version, 1 = shorter version, 2 = shortest version
length_version: int = 0

print("Ready and waiting for incoming requests ...")

while True:
    message = socket.recv()

    if monitor:
        print("Received message:", message)

    if message == "long":
        length_version = 0
    elif message == "middle":
        length_version = 1
    else:
        length_version = 2

    sys_info = get_system_info(length_version)

    """if not length_version == 2:
        length_version = 2

    loop_counter += 1

    if loop_counter == 15:
        length_version = 1

    if loop_counter > 30:
        loop_counter = 0
        length_version = 0"""

    if monitor:
        print(sys_info)

    json_string = json.dumps(sys_info)
    print(json_string)
    socket.send_string(json_string)

我的 C# 代码:

static void Main(string[] args)
    {
        //using (var requestSocket = new RequestSocket(">tcp://localhost:5557"))
        using (var requestSocket = new RequestSocket("tcp://localhost:5557"))    
        {
            while (true) {
                Console.WriteLine($"Running the server ...");
                string msg = "short";
                requestSocket.SendFrame(msg);
                var message = requestSocket.ReceiveFrameString();
                Console.WriteLine($"requestSocket : Received '{message}'");
                //Console.ReadLine();
                Thread.Sleep(1_000);
            }
        }
    }
4

4 回答 4

0

我可能会迟到,但同样的事情也发生在我身上。我有一个使用 pyzmq 的 python 订阅者和一个使用 NetMQ 的 C# Publisher。

几个小时后,我突然想到我需要让 Publisher 一些时间来连接。所以一个简单System.Threading.Thread.Sleep(500);的连接/绑定之后就可以了。

于 2021-10-13T15:30:13.160 回答
0

你的端口号不匹配,python代码是55557,c#是5557

于 2020-12-14T10:39:51.320 回答
0

看到你问题的时期可能是因为版本。我通过 Windows/C# 与 NTMQ 4.0.0.207 239,829 7/1/2019 和 Ubuntu/Python 与 zeromq=4.3.1 和 pyzmq=18.1.0 的通信长时间运行良好的程序。我只是尝试更新以使用相同的 NETMQ 版本,但使用新版本 zeromq=4.3.3 和 pyzmq=20.0.0 但某处存在问题/错误,它不再运行良好。

所以你的代码看起来不错可能是它的软件版本问题在 c# 端尝试使用 NTMQ 4.0.0.207 和在 python 端使用 pyzmq=18.1.0 的 zeromq=4.3.1

于 2021-01-14T17:02:28.397 回答
0

Q : "如何在 ac# 和 python 应用程序之间建立 ZeroMQ 请求-回复"

问题始于对REQ/REP原型如何工作的误解。

您的代码使用 - 方法的阻塞形式,因此每当两步遇到麻烦.recv()时,您都将永远处于游戏之外,永远无法挽救(因为没有采取应有的注意来防止这种无限的生活-REQ/REP锁)。

而是开始使用.poll()-method 开始在队列的本地 AccessNode 端测试消息的存在/不存在,这使您能够完全有状态地决定下一步要做什么,如果消息已经存在或还没有存在,以便保持 API 定义的强制顺序需要“压缩”
REQ-side .send()- .recv()- .send()- .recv()-... 与
REP-side .recv()- .send()- .recv()- .send()-... 调用的成功链接,REQ/REP原型是否作为分布式工作-Finite-State-Automaton (dFSA),由于“远程”端不符合本地端的期望,它可能很容易死锁。

拥有一个在非阻塞、.poll()基于 - 的模式下工作的代码可以避免陷入这些陷阱,因为您可以在仍然控制代码执行路径(调用阻塞-模式方法盲目相信它会在未来的某个时间点返回,如果有的话,根本不可能)。

量子点


如果有疑问,可以使用PUSH/PULL原型,因为PUB/SUB-archetype 可能会遇到订阅不匹配的问题(主题列表管理是另一个,版本相关的详细信息)。

任何语言绑定都应该没有其他问题,如果它们通过了所有记录在案的 ZeroMQ API 功能而没有创建任何“快捷方式” - 在某些情况下,特定于语言的绑定PUB/SUB在发送时采用了“另一个”方向纯消息,转换为多部分消息,将主题放入第一帧,将消息放入另一帧。这是一个与 ZeroMQ API 不兼容的绑定示例,其中很明显会出现跨语言/不匹配的绑定版本系统问题。

于 2020-12-14T18:20:04.267 回答