使用 UDP 协议绑定或连接时出错(ZeroMQException(156384764):协议与套接字类型不兼容)

问题描述 投票:0回答:1

我使用 SocketType.sub 和 SocketType.pub 从 udp 地址进行连接和绑定 我观看了 zmq 的文档,我必须使用像 Radio 和 Dish 这样的套接字类型,但我在 dartzmq 中找不到它

我的简单代码如下:


import 'dart:io';

import 'package:dartzmq/dartzmq.dart';

void dishRadioDart() async {
  String udpAddress = "udp://127.0.0.1:5566";
  final context = ZContext();
  final dishSocket = context.createSocket(SocketType.pub);
  final radioSocket = context.createSocket(SocketType.sub);

  try {
    dishSocket.bind(udpAddress);
    print("dish socket binded to address : ${udpAddress}");
    radioSocket.connect(udpAddress);
    print("radio socket connect to address : ${udpAddress}");
    radioSocket.setOption(ZMQ_SUBSCRIBE, "");

    radioSocket.payloads.listen((event) {
      print("received message");
      print("received message is : ${event}");
    });
    while (true) {
      print("send message ");
      dishSocket.sendString("abdullah message ");
      sleep(const Duration(seconds: 1));
    }
  } catch (e) {
    print("error e : ${e}");
  }
}

我也在github上问过,任何人都可以从这个链接看到:https://github.com/enwi/dartzmq/issues/31

最后,我尝试在我的flutter应用程序中使用udp协议和zeromq来在python应用程序和flutter应用程序之间发送和接收一些控制项。 任何人都可以在这里帮助我。

flutter dart udp zeromq
1个回答
0
投票

问题似乎是,虽然您将套接字称为

dish
radio
,但实际上您将它们创建为
pub
sub
,它们不能通过 UDP 连接工作。请查看 ZMQ C API 参考此处

此外,我对您如何通过这种传输方式接收消息有点警惕。您似乎已经设置了对接收事件的回调。这需要异步运行,否则 UDP 数据包将在发生任何事情之前消失。我不知道ZMQ在Python中是如何实现的。如果它是标准 C 库的绑定,那么就可以了,因为无论如何它都会有一个单独的套接字管理线程(并且它将与代码的其余部分异步运行)。否则,如果它是一个受 GIL 约束的 Python 线程(取决于所使用的 Python 版本),那么虽然它在源代码中看起来是异步的,但实际上可能并不是异步运行的。这对于任何其他传输(如 tcp、ipc)都无关紧要,但对于 udp 可能很重要。最好的办法是换成实际的碟子和收音机插座,尝试一下,看看会发生什么!

© www.soinside.com 2019 - 2024. All rights reserved.