我正在尝试使用 java 风格的 zmq 来测试在我的项目中使用 PGM over TCP 的好处。因此,我将 zmq 指南中的天气示例更改为使用 epgm 传输。一切都编译并运行,但没有发送或接收任何内容。如果我将传输改回 TCP,服务器会接收到客户端发送的消息,并且我会得到我期望的控制台输出。
那么,使用 PGM 有哪些要求呢?我更改了传递给绑定和连接方法的字符串,以遵循 zmq_pgm 的 zmq api:“transport://interface;multicast address:port”。那没有用。每当我尝试使用这种格式时,都会出现无效参数错误。因此,我通过删除“有效”的界面和分号来简化它,但我没有得到任何结果。
我找不到使用 pgm/epgm 的 jzmq 示例,并且 java 绑定的 api 文档没有为传递给绑定或连接的端点定义适当的字符串格式。那么我在这里错过了什么?我必须为客户端和服务器使用不同的主机吗?
需要注意的一点是,我在 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();
}
}