java - 如何使用ZeroMq实现异步即时通讯聊天

标签 java chat zeromq instant-messaging

方法

我正在使用 ZeroMq 构建一个异步 IM/聊天应用程序,作为学习练习,使用以下方法。

服务器使用两个ROUTER套接字,类似于lbbroker.java,从传入读取并写入传出,同时操作信封交付给预定的接收者。

客户端使用 socket.setIdentity() 设置唯一身份,并使用 PULL 和 PUSH 套接字(而不是 REQ/REP)异步发送和接收聊天消息。我已经构建并测试了代码,一切似乎都工作正常。

Async Chat

问题

  • 将 PUSH/PULL 与 ROUTER 一起使用是有效的方法吗?

  • 为什么聊天客户端在断开连接然后重新连接时变得无法访问?

如果 Sally 断开连接然后重新连接,她将无法联系到,她将无法再接收聊天消息。调试服务器后,我确认它确实在向 sally 发送带有正确信封的消息。我还使用了 outgoing.setRouterMandatory(true) 来确保服务器不会丢弃不可寻址的消息,但不会引发任何错误。

最佳答案

经过进一步研究,虽然 PUSH 和 PULL 套接字可与 ROUTER 配合使用,但根据 ZeroMq 规范,它们不是有效的套接字组合。

客户端上的 DEALER 套接字是更好的方法。 DEALER 支持双向消息传输,基本上完成 PUSH 和 PULL 的工作,但使用单个套接字。

我在 Github 上发起了一个讨论该问题的帖子,其中包含一些使用 DEALER 的基于代理的模式的示例代码。

https://github.com/zeromq/jeromq/issues/81

关于java - 如何使用ZeroMq实现异步即时通讯聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18048951/

相关文章:

java - ZeroMQ+Protobuf 的替代品(ZeroMQ 对 Java 来说已经死了吗?)

python - 确保工作进程总是在 zeroMQ 中终止

java - 如何获取tomcat日志输出?

cakephp - Cake 2.x 是否有任何聊天/消息插件?

docker - 如何使用 docker-compose 在 docker/container 之外公开容器端口?

java - java中服务器到服务器的通信——负载均衡

android - Scringo 群聊功能

java - Android:由于存在软件包,即使以前没有安装过,也需要卸载

java - 当有等待线程时如何优雅地降级程序?

java - 如何在迭代两个列表时检查字符串相等性?