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