2015-06-18 66 views
1

在我的方案中,有n個客戶端和1個服務器。客戶端向服務器發送請求並接收響應。此外,還需要一個單向消息傳遞機制,其中服務器將特定的消息發送給特定的客戶端,並且期望沒有答案。所以服務器必須能夠專門用單向消息機制來處理客戶端。ZeroMQ:如何向特定用戶發送消息

請求 - 響應部分很簡單(REQ和REP套接字),但我不確定如何實現單向消息部分。我嘗試使用PUB和SUB插口與每個用戶從服務器請求一個ID,只訂閱具有此ID這樣的消息:

rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, 
        subscriber_id, strlen (subscriber_id)); 

這個工作在理論,但問題是,所有消息都播出然後在客戶端進行過濾,這對我來說不是一種選擇。

所以我的問題是:有沒有更好的方法來解決特定的客戶端?

+0

你描述的是用'PUSH' - 'PULL'插座類型完成的。他們是單向的,你可以做到你想要的。 – Mjh

+0

謝謝,但我仍然不明白我將如何解決許多客戶中的特定客戶。服務器將有一個PUSH套接字,但沒有什麼像'socket.SendTo(message,receiverAddress)'方法。你如何處理接收器? – loki

+0

每個客戶端使用一個套接字。如果您複用信息,您可以使用經銷商/路由器(指南中有各種示例)。有關於服務發現以及如何處理多路複用,異步請求回覆等的整個部分。 – Mjh

回答

2

所以,只有兩種方法可以做你想做的事,而且它們都不是直接擊中目標 - 但最終我會提出一個可能會更好的建議。

你的要求有服務器套接字地址的客戶端插座直接只能在以下兩種方式來完成:

  • 使用路由器插座。 ROUTER套接字發送的消息的第一幀是目標對等套接字的套接字ID。它是唯一支持任何通用尋址的套接字類型。
  • 每個對等設備旋轉一個插座。通過這種方式,您可以在應用程序中處理尋址:瞭解哪個套接字屬於您想要的對等方,並且您只是使用它。

如果需要是一個單向的插座類型,那麼第二種方法是你留下了唯一的選擇。然後,您可以選擇任何單向通信策略(PUB/SUB,PUSH/PULL),併爲每個連接設置一個新的套接字。

我會強烈推薦ROUTER選項,幾乎沒有理由強制單向要求。只需在ROUTER上將接收HWM設置爲1,並忽略或放棄定期發送給它的消息。或者,跳過REP/REQ對,只需所有與ROUTER/DEALER,這可能是最好的選擇。

相關問題