2016-12-22 2 views
0

Я пытаюсь реализовать шаблон ROUTER/ROUTER в VS, используя ZeroMQ, и я не могу заставить его работать. Из того, что я могу сказать, я знаю, что сервер отлично работает, так как я пробовал его с другими типами клиентских сокетов без каких-либо проблем. Но при создании ROUTER он не работает.Почему не удается заставить шаблон ZeroMQ ROUTER/ROUTER работать?

У кого-нибудь есть идея, как исправить клиента?

Мой код выглядит следующим образом:

static string ip = "127.0.0.1"; 
static string port = "5555"; 
static string endpoint = string.Format("tcp://{0}:{1}", ip, port); 

static void Main(string[] args) 
    { 
     Task.Factory.StartNew(StartRouterServer,TaskCreationOptions.LongRunning); 
     Task.Factory.StartNew(() => StartRouterClient(0), TaskCreationOptions.LongRunning); 

     Thread.Sleep(10000000); 
    } 

static void StartRouterClient(int i) 
    { 
     using (ZContext context = new ZContext()) 
     using (ZSocket router = new ZSocket(context, ZSocketType.ROUTER)) 
     { 
      router.IdentityString = "client: " + i; 
      router.Connect(endpoint); 
      //send message 
      router.SendMore(new ZFrame(router.IdentityString)); 
      router.SendMore(new ZFrame()); 
      router.Send(new ZFrame("Hi")); 

      using (ZMessage received = router.ReceiveMessage()) 
      {//on receiving a reply from the server, you come here. 
       Console.WriteLine("Received a message back from the server!!"); 
      } 
     } 
    } 

static void StartRouterServer() 
    { 
     using (ZContext context = new ZContext()) 
     using (ZSocket router = new ZSocket(context, ZSocketType.ROUTER)) 
     { 
      router.IdentityString = "router"; 
      router.Bind(endpoint); 
      Console.WriteLine("The server is bound to {0}", router.LastEndpoint); 

      while (true) 
      { 
       using (ZMessage received = router.ReceiveMessage()) 
       {//what you do when you receive the message. 
        Console.WriteLine("received a message!"); 
        router.SendMore(received[0]); 
        router.SendMore(new ZFrame()); 
        router.Send(new ZFrame("Hi back!!")); 
       } 
      } 
     } 
    } 

ответ

0

Хорошо, NVM, я испортил адресацию. Для этого шаблона каждый маршрутизатор должен знать индивидуальность друг друга. Так это работает. т.е. в методе StartRouterClient(), мне пришлось заменить router.SendMore(new ZFrame(router.IdentityString)); с router.SendMore(server.IdentityString);

1

Возможно создается сокет клиента и пытается отправить перед сокет сервер привязан к порту 5555. Если это произойдет, сокет клиента будет понижаться сообщение.

Попробуйте положить Thread.Sleep(1000) между вызовами Task.Factory.StartNew(), чтобы время сокет сервера создавать и связывать.

(я написал подобный код в Python, и она работала, пока сокет сервера был уверен, что быть связанным, прежде чем клиент подключен и отправить.)

+0

я пытался. не работал. Это было обращение, которое я прищурился. Но спасибо за вашу помощь! – rmehta

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