我遇到以下问题:
我有一个客户端(最终是n-clients)并且喜欢连接到服务器。客户端知道服务器/主机地址,但服务器不知道客户端的地址。我希望能够在客户端 - 服务器之间完成以下消息传递模式(客户端和服务器都需要能够完成以下消息模式):
同样重要的一点,我奋斗的地方是如何连接到主机,同时仍然能够发送和接收消息。主机无法连接到客户端,它只能接受客户端连接请求。请注意,我不寻找与客户端和服务器连接的代理/代理的解决方案,否则我可以直接使用rabbitmq等解决方案。
如何最好地完成此操作,参考代码示例更好。
非常感谢。
答案 0 :(得分:11)
要连接到服务器,客户端需要DEALER
套接字,服务器上需要ROUTER
套接字。因为您需要发布订阅模式,所以客户端需要SUB
套接字,服务器端需要PUB
套接字。
Client Server
+-------+ +--------+
| Dealer| <--> | Router |
| Sub | <-- | Pub |
+-------+ +--------+
因此,您绑定路由器和Pub套接字,并连接Dealer和Sub套接字。比你想要的时候:
发布消息(无需回复):创建一个信封(酒吧,频道,消息)并通过经销商发送,在路由器端,路由器将收到以下信封(经销商,酒吧,频道,消息) ),所以你可以通过PUB套接字在频道上发布消息。
接收消息(无需回复):已完成客户端的SUB
套接字,并且由于每个发布都通过ROUTER,您可以轻松实现订阅机制,或者只需添加{ {1}}服务器端的套接字,并连接(inproc)到SUB
套接字(也许这是一个更清洁的解决方案)。
请求/接收消息(预期回复):可以通过经销商 - 路由器完成。您只需创建一个不同的信封(请求,消息),因此您的路由器(接收:经销商,请求,消息)将知道它应该被处理,并可以向经销商发送回复。如果您的服务器需要向客户端发送请求,您只需要跟踪连接的客户端,并发送信封(经销商,req,msg),以便您的经销商可以回复示例(代表,消息)信封。 / p>
流媒体:如您所述,可以使用发布模式
我就是这样做的,如果你需要心脏跳动,它会有点复杂,但并不多。