我正在使用这个程序来测试一个PULL
带有ROUTER
. 我创建/绑定 a ROUTER
,然后将带有标识的 PULL 套接字连接到它;然后使用其身份发送专门针对客户端的ROUTER
消息(基本 zeromq 封装)
测试程序
public static void main(String[] o){
ZContext routerCtx = new ZContext();
Socket rtr = routerCtx.createSocket( ZMQ.ROUTER);
rtr.setRouterMandatory(true);
rtr.bind("tcp://*:5500");
ZContext clientCtx = new ZContext();
Socket client1 = clientCtx.createSocket( ZMQ.PULL);
client1.setIdentity("client1".getBytes());
client1.connect("tcp://localhost:5500");
try{
//Thread.currentThread().sleep(2000);
rtr.sendMore("client1");
rtr.sendMore("");
rtr.send("Hello!");
System.out.println( client1.recvStr());
System.out.println("Client Received: " + client1.recvStr());
}catch(Exception e1){
System.out.println( "Could not send to client1: " + e1.getMessage());
}
routerCtx.destroy();
clientCtx.destroy();
}
结果
预期的结果是 print Client Received: Hello!"
,但 ROUTER 会抛出与不可寻址消息一致的异常;我习惯setRouterMandatory(true)
在这种情况下抛出该异常,但是,客户端显式设置了一个身份,服务器发送到该身份,所以我不明白为什么会引发异常。
临时修复
如果我通过取消注释添加一点延迟Thread.currentThread().sleep(2000);
,则消息已成功传递,但我鄙视使用睡眠和等待,它会创建混乱和脆弱的代码,但更重要的是,没有回答“为什么?”
问题
- 为什么会这样?据我了解,“后期加入”仅适用于 PUB/SUB 套接字。
- PULL 与 ROUTER 是无效的套接字组合吗?我将它用于聊天程序,除了这个问题,它工作得很好。