2015-02-26 3 views
1

Я пишу свое первое приложение с NetMQ (реализация ZeroMQ для .NET).Общение с классическим сокетом TCP

Мне также нужно прослушать информацию, отправленную с клиента, используя традиционный сокет TCP (a.k.a не-0MQ сокет).

Я видел ссылки на доступность этого типа сокета в официальной документации ZeroMQ here (смотрите ZMQ_STREAM), но очень мало деталей о том, как его использовать (и это тоже мало помогает, .NET API совсем немного отличается от C++ API).

offical NetMQ documentation также не упоминает тип Streaming socket.

Наконец, я просмотрел комплект тестов для NetMQ на Github и нашел частичный ответ на мой вопрос в method RawSocket.

Следующий фрагмент кода работает:

using (NetMQContext context = NetMQContext.Create()) 
{ 
    using (var routerSocket = context.CreateRouterSocket()) 
    { 
     routerSocket.Options.RouterRawSocket = true; 
     routerSocket.Bind("tcp://127.0.0.1:5599"); 

     byte[] id = routerSocket.Receive(); 
     byte[] message = routerSocket.Receive(); 

     Console.WriteLine(Encoding.ASCII.GetString(id)); 
     Console.WriteLine(Encoding.ASCII.GetString(message)); 
    } 
} 

При использовании стандартных тест-инструментов TCP/IP, байт [] сообщение печатается красиво, например, как это:

Hello World! 

но байт [] идентификатор печатается так:

???♥ 

Другими словами, я понятия не имею, что случилось с частью идентификатора. Почему routerSocket.Receive называется дважды? Что содержится в идентификаторе? Является ли это чем-то специфичным для ZeroMQ/NetMQ, или что-то конкретная информация TCP/IP здесь извлекается?

+1

Обратитесь к документации [ссылка] (http://netmq.readthedocs.org/en/latest/router-dealer /) на RouterSocket. Этот тип сокета имеет идентификатор перед каждым сообщением. Это двоичный идентификатор, поэтому вы не сможете распечатать его с помощью ASCII.GetString(). Вы можете создать int из 4 байтов и напечатать значение этого int, если хотите увидеть идентификатор сообщения. – Mangist

+0

@ А, спасибо! По какой-то причине я смотрел на Steam Sockets. Спасибо, это объясняет многое. Имеет ли идентификатор какой-либо смысл при использовании RouterSocket для подключения клиента, отличного от 0MQ? –

ответ

1

@Mangist для указания этого.

Ответ в документации RouterSocket:

Идентичность, иногда называемый адрес, это просто двоичная строка , без смысла, кроме «это уникальный дескриптор соединения». Затем, когда вы отправляете сообщение через сокет ROUTER, вы сначала отправляете идентификационный фрейм .

При получении сообщений гнездо ZMQ_ROUTER должно передать сообщение , содержащее идентификатор исходного отправителя, в сообщение перед передачей его в приложение. Полученные сообщения: - справедливая очередь из всех подключенных одноранговых узлов. При отправке сообщений a Сокет ZMQ_ROUTER должен удалить первую часть сообщения и использовать , чтобы определить личность однорангового узла, сообщение должно быть маршрутизировано .

Идентичность - это сложная концепция для понимания, но важно, если вы хотите стать экспертом ZeroMQ. Сокет ROUTER изобретает случайный идентификатор для каждого соединения, с которым он работает. Если есть три разъема REQ, подключенные к гнезду ROUTER, он будет изобретать три случайных идентификатора , по одному для каждого гнезда REQ.

Данное изображение иллюстрирует основную концепцию ID кадров:

enter image description here

Смежные вопросы