我正在使用ZeroMq构建一个异步IM /聊天应用程序,就像学习练习一样,使用以下方法。
服务器使用两个ROUTER套接字,类似于lbbroker.java
,从incoming
读取并写入outgoing
,同时操作信封以传送到预期的接收方。
客户端使用socket.setIdentity()
设置唯一标识,并使用PULL和PUSH套接字而不是REQ / REP来异步发送和接收聊天消息。我已经构建并测试了代码,一切似乎都运行良好。
使用带路由器的PUSH / PULL是一种有效的方法吗?
为什么聊天客户端在下线然后重新连接时无法访问?
如果Sally断开连接然后重新连接,则Sally无法访问,她无法再接收聊天消息。在调试服务器之后,我确认它肯定会发送带有正确信封的消息给sally。我还使用了outgoing.setRouterMandatory(true)
来确保服务器没有删除不可寻址的消息,但没有出现错误。
答案 0 :(得分:3)
经过进一步研究,虽然PUSH和PULL套接字与ROUTER配合使用,但根据ZeroMq规范,它们不是有效的套接字组合。
客户端的DEALER套接字是一种更好的方法。 DEALER支持双向消息传输,基本上可以完成PUSH和PULL的工作,但只需要一个插槽。
我在Github上开始讨论这个问题,它包含一些使用DEALER的基于代理的模式的示例代码。