gpt4 book ai didi

java - 使用 JZMQ 与 EPGM 传输不发送或接收数据

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:33 24 4
gpt4 key购买 nike

我正在尝试使用 java 风格的 zmq 来测试在我的项目中使用 PGM over TCP 的好处。因此,我更改了 zmq 指南中的天气示例,以使用 epgm 传输。一切都编译并运行,但没有发送或接收任何内容。如果我将传输更改回 TCP,服务器会接收从客户端发送的消息,并且我会得到我期望的控制台输出。

那么,使用PGM有什么要求呢?我更改了传递给绑定(bind)和连接方法的字符串,以遵循 zmq_pgm 的 zmq api:“transport://interface;multicast address:port”。那行不通。每当我尝试使用此格式时,我都会收到无效参数错误。因此,我通过删除“有效”的界面和分号来简化它,但我没有得到任何结果。

我还没有找到使用 pgm/epgm 的 jzmq 示例,并且 java 绑定(bind)的 api 文档没有为传递给绑定(bind)或连接的端点定义适当的字符串格式。那么我在这里缺少什么?我必须为客户端和服务器使用不同的主机吗?

值得注意的是,我在 VirtualBox VM(Ubuntu 14.04/OSX Mavericks 主机)上运行代码。我不确定这是否与我目前面临的问题有关。

服务器:

public class wuserver {

public static void main (String[] args) throws Exception {
// Prepare our context and publisher
ZMQ.Context context = ZMQ.context(1);

ZMQ.Socket publisher = context.socket(ZMQ.PUB);
publisher.bind("epgm://xx.x.x.xx:5556");
publisher.bind("ipc://weather");

// Initialize random number generator
Random srandom = new Random(System.currentTimeMillis());
while (!Thread.currentThread ().isInterrupted ()) {
// Get values that will fool the boss
int zipcode, temperature, relhumidity;
zipcode = 10000 + srandom.nextInt(10000) ;
temperature = srandom.nextInt(215) - 80 + 1;
relhumidity = srandom.nextInt(50) + 10 + 1;

// Send message to all subscribers
String update = String.format("%05d %d %d", zipcode, temperature, relhumidity);
publisher.send(update, 0);
}

publisher.close ();
context.term ();
}
}

客户:

public class wuclient {

public static void main (String[] args) {
ZMQ.Context context = ZMQ.context(1);

// Socket to talk to server
System.out.println("Collecting updates from weather server");
ZMQ.Socket subscriber = context.socket(ZMQ.SUB);
//subscriber.connect("tcp://localhost:5556");
subscriber.connect("epgm://xx.x.x.xx:5556");

// Subscribe to zipcode, default is NYC, 10001
String filter = (args.length > 0) ? args[0] : "10001 ";
subscriber.subscribe(filter.getBytes());

// Process 100 updates
int update_nbr;
long total_temp = 0;
for (update_nbr = 0; update_nbr < 100; update_nbr++) {
// Use trim to remove the tailing '0' character
String string = subscriber.recvStr(0).trim();

StringTokenizer sscanf = new StringTokenizer(string, " ");
int zipcode = Integer.valueOf(sscanf.nextToken());
int temperature = Integer.valueOf(sscanf.nextToken());
int relhumidity = Integer.valueOf(sscanf.nextToken());

total_temp += temperature;

}
System.out.println("Average temperature for zipcode '"
+ filter + "' was " + (int) (total_temp / update_nbr));

subscriber.close();
context.term();
}
}

最佳答案

有几种可能性:

  • 您需要确保 ZMQ 是使用 --with-pgm 选项编译的:see here - 但如果您没有看到“协议(protocol)不受支持”,这似乎不是您的问题
  • 使用原始 pgm 需要 root 权限,因为它需要能够创建原始套接字...但 epgm 不需要,因此它不应该是您的问题(我只是因为您使用术语“pgm/epgm”而提出它,并且您应该意识到它们并非在所有情况下都同样可用)
  • 您的情况中实际出现的问题是 pgm/epgm 需要网络路径上的支持。理论上,它需要您的路由器的支持,因此您的应用程序可以发送一条消息,并让您的路由器向每个客户端发送多条消息,但如果您的服务器足够了解,它可能可以立即发送多条消息并绕过此问题路由器支持。正如您所猜对的那样,问题是尝试在一台主机 is not supported 上完成这一切。 .

因此,客户端和服务器需要不同的主机。

关于java - 使用 JZMQ 与 EPGM 传输不发送或接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847589/

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