我強烈建議你閱讀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