我强烈建议你阅读the guide,它回答了与许多人一起这个问题。
你需要添加setTimeout()
是因为当它准备的PUB
插座将发送该消息的原因,它不会等到用户准备。那么,这是怎么回事,当你忽略超时上是类似以下内容:
SETUP PUB SETUP SUB
| |
BIND |
| CONNECT
| |
FINISH BINDING |
| |
| |
SEND MSG1--[| |
| |
|]--------------FINISH CONNECTING
| |
SEND MSG2---- |
| | |
| ---- |
| | |
| ----[RECV MSG2]
| |
... ...
...您的出版商可以bind()
立即,它并不需要去做出任何网络资源的请求。您的订阅者必须外出并与发布商建立连接,这需要时间。因此,发布者已准备就绪,并且将MSG1
发送到...无处,因为没有订阅者准备好它。它被无声地抛弃了。用户完成连接后,它可以接收MSG2
没有问题。
其原因是因为PUB/SUB被设计用于信息快速陈旧的时候 - 比如报纸。如果你正在制作一份报纸,并且在第一天你没有任何订阅者,那么当你真正收到订阅者时,你不会在第二天持有同一版本的报纸 - 你会发送他们的新闻。你放弃它并为你的新订户编写另一个版本。
如果这不适合您的数据模型,那么也许不同的套接字配对会对您更好。任何其他套接字类型将等待,直到它有一个对等体发送其消息。
非常感谢Jason – Shad