2013-06-08 11 views
8

Sono di fronte al seguente problema:ZeroMQ, Client <-> Server, la comunicazione bidirezionale è possibile solo se il client si connette all'host?

Ho un client (in definitiva n-client) e mi piace connettersi a un server. I client conoscono l'indirizzo server/host ma il server non conosce l'indirizzo dei client. Mi piace essere in grado di realizzare i seguenti modelli di messaggistica tra client-server (entrambi, il client e il server devono essere in grado di realizzare i seguenti modelli di messaggi):

  • pubblicare messaggi (nessuna risposta previsto)
  • ricevere messaggi (nessuna risposta atteso)
  • Richiesta/ricevere messaggi (rispondere previsto)
  • messaggi stream (questo può essere ridondante in quanto può essere servito attraverso il modello di pubblicare messaggio di cui sopra)

Anche in questo caso, il punto importante e in cui lotto è come connettersi all'host pur continuando a inviare e ricevere messaggi. L'host non ha possibilità di connettersi ai client, può solo accettare richieste di connessione client. Si noti che non cerco una soluzione con proxy/broker a cui sia il client che il server si colleghino altrimenti potrei andare direttamente con soluzioni come rabbitmq.

Come posso fare meglio questo, ancora meglio con riferimento ai campioni di codice.

Grazie mille.

+0

Chiaramente non avete letto la guida ZeroMq; queste domande di base sono risolte solo nella prima sezione con esempi di codice, leggerlo, ti stupirà: http://zguide.zeromq.org/page:all – raffian

+2

@Raffian, con tutto il dovuto rispetto ma potresti avere frainteso/frainteso la mia domanda. In nessun modo questa domanda è stata risolta in nessuno dei primi capitoli della guida. Non ho nemmeno trovato uno schema avanzato nella guida che risponda a questa domanda. Ho trovato del codice da qualcun altro in rete che ha implementato una soluzione simile a quella che sto cercando con front e backend su entrambi, lato server e client su compiti diversi e con due socket ciascuno. Quindi è tutt'altro che banale e apprezzerei se potessi rivedere la mia domanda e il tuo downvote. –

+0

Ecco il riferimento che ho citato: http://www.codebullets.com/a-splendid-new-way-of-tcp-messaging-920. Non fa molto a parte la messaggistica a senso unico, ma realizza la messaggistica duplex. Giudicate voi stessi e pls indicatemi le pagine del vostro riferimento, qualcosa di remotamente simile è compiuto nella guida zeromq. –

risposta

9

Per il collegamento al server, è necessario un socket DEALER sul lato client e un socket ROUTER sul server. Poiché è necessario un modello di sottoscrizione di pubblicazione, è necessario un socket SUB sul lato client e un socket PUB sul lato server.

Client  Server 
+-------+  +--------+ 
| Dealer| <--> | Router | 
| Sub | <-- | Pub | 
+-------+  +--------+ 

Quindi si collegano le prese Router e Pub e si collegano il rivenditore e le prese secondarie. Rispetto a quando si desidera:

  • pubblicare messaggi (nessuna risposta previsto): Creazione di una busta (pub, canale, messaggio) e inviarlo attraverso il Dealer, sul lato Router il router riceverà il seguente busta (rivenditore, pub, canale, messaggio), in modo da poter pubblicare il messaggio sul canale tramite la presa PUB.

  • ricevere messaggi (nessuna risposta previsto): E 'fatto con le SUB prese sul lato client, e dal momento che ogni pubblicazione passa attraverso il router ci si può facilmente implementare un meccanismo di sottoscrizione, o semplicemente aggiungere una presa SUB sul lato server e connettersi (inproc) alla presa PUB (forse questa è una soluzione più pulita).

  • Messaggi di richiesta/ricezione (risposta prevista): È possibile farlo con il rivenditore - router. basta creare una busta diversa (richiesta, messaggio), in modo che il router (ricevere: rivenditore, richiesta, messaggio) sappia che deve essere elaborato e può inviare una risposta al rivenditore. Se il server ha bisogno di inviare richieste ai client, è sufficiente tenere traccia dei client collegati e inviare una busta (rivenditore, richiesta, msg), in modo che il rivenditore possa rispondere con un esempio (busta, messaggio).

  • Streaming: come avete dichiarato che può essere fatto con il modello di pubblicare

Questo è come io lo farei, se avete bisogno di battito del cuore, diventa un po 'complicato, ma non molto.

+0

@belazs, grazie, mi chiedo solo, se non mi interessa gli abbonamenti argomento non posso semplicemente andare via con un rivenditore sul lato client e router sul lato server? –

+1

@MattWolf Sì, nel mio esempio sub viene utilizzato solo per ricevere messaggi dal publisher. Sono contento di poterti aiutare. – balazs

+0

Grande, grazie per il tuo aiuto –

Problemi correlati