2013-08-12 7 views
3

Что было бы лучшим способом сделать общение по всему миру, было бы лучше сделать паб-суб, все, кто подписывается на всех, или есть тип сокета, более подходящий для это?Zeromq Broadcast All to All

ответ

5

Вы можете добиться этого с помощью прокси-сервера XPUB/XSUB; многие клиенты говорят со многими другими клиентами; обзор в руководстве here.

Proxy

Посредник выступает в качестве посредника для подключения многие ко многим клиентам; пример от expresso.c. Прокси-сервер работает автономный:

void *subscriber = zsocket_new (ctx, ZMQ_XSUB); 
zsocket_bind (subscriber, "tcp://*:6000"); 
void *publisher = zsocket_new (ctx, ZMQ_XPUB); 
zsocket_bind (publisher, "tcp://*:6001"); 
zmq_proxy (subscriber, publisher, 0); 

Клиент

клиент играет роль издателя и подписчика одновременно. В основной теме создайте паб-сокет, подключите его к стороне XSUB прокси; используйте это для отправки сообщений.

void *publisher = zsocket_new (ctx, ZMQ_PUB); 
zsocket_connect (publisher, "tcp://localhost:6000"); 

Теперь вы хотите создать дочерний поток в клиенте, который прослушивает сообщения от прокси на XPUB:

void *subscriber = zsocket_new (ctx, ZMQ_SUB); 
zsocket_connect (subscriber, "tcp://localhost:6001"); 

Когда клиент издает сообщения, все клиенты прослушивает XSub получит его, включая клиента, который отправил сообщение, поэтому имейте это в виду.

Если вам не нужна двунаправленная передача сообщений, реализуйте PubClient и SubClient, каждый из которых играет предполагаемую роль для отправки или получения, но не для обоих; вышеупомянутый клиентский код будет просто разделен на два класса для этого подхода.

Опять же, есть другие способы сделать это, но это наиболее просто. надеюсь, что это поможет