2016-10-20 2 views
0

Je suis en train de créer un programme rpc pour communiquer les hôtes situés sur des réseaux différents et a choisi la configuration du routeur-revendeur de NetMQ fourni ici: http://netmq.readthedocs.io/en/latest/router-dealer/#router-dealerclient NetMQ à la messagerie client

Mais le problème est que le routeur sélectionne toujours aléatoire concessionnaire lors du routage d'un message à backend. Code qui je:

using (var frontend = new RouterSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5556")))//"@tcp://10.0.2.218:5559" 
       using (var backend = new DealerSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5557")))//"@tcp://10.0.2.218:5560" 
       { 
        // Handler for messages coming in to the frontend 
        frontend.ReceiveReady += (s, e) => 
        { 
         Console.WriteLine("message arrived on frontEnd");        
         NetMQMessage msg = e.Socket.ReceiveMultipartMessage(); 
         string clientAddress = msg[0].ConvertToString();        
         Console.WriteLine("Sending to :" + clientAddress); 
         //TODO: Make routing here 
         backend.SendMultipartMessage(msg); // Relay this message to the backend      }; 

        // Handler for messages coming in to the backend 
        backend.ReceiveReady += (s, e) => 
        { 
         Console.WriteLine("message arrived on backend"); 
         var msg = e.Socket.ReceiveMultipartMessage(); 

         frontend.SendMultipartMessage(msg); // Relay this message to the frontend 
        }; 

        using (var poller = new NetMQPoller { backend, frontend }) 
        { 
         // Listen out for events on both sockets and raise events when messages come in 
         poller.Run(); 
        } 
       } 

Code pour le client:

using (var client = new RequestSocket(">tcp://" + "127.0.0.1" + ":5556")) 
     { 
      var messageBytes = UTF8Encoding.UTF8.GetBytes("Hello"); 
      var messageToServer = new NetMQMessage(); 
      //messageToServer.AppendEmptyFrame(); 
      messageToServer.Append("Server2"); 
      messageToServer.Append(messageBytes); 
      WriteToConsoleVoid("======================================"); 
      WriteToConsoleVoid(" OUTGOING MESSAGE TO SERVER "); 
      WriteToConsoleVoid("======================================"); 
      //PrintFrames("Client Sending", messageToServer); 
      client.SendMultipartMessage(messageToServer); 

      NetMQMessage serverMessage = client.ReceiveMultipartMessage(); 
      WriteToConsoleVoid("======================================"); 
      WriteToConsoleVoid(" INCOMING MESSAGE FROM SERVER"); 
      WriteToConsoleVoid("======================================"); 
      //PrintFrames("Server receiving", clientMessage); 
      byte[] rpcByteArray = null; 
      if (serverMessage.FrameCount == 3) 
      { 
       var clientAddress = serverMessage[0]; 
       rpcByteArray = serverMessage[2].ToByteArray(); 
      } 

      WriteToConsoleVoid("======================================"); 
      Console.ReadLine(); 
     } 

Code pour le concessionnaire:

using (var server = new ResponseSocket()) 
     { 
      server.Options.Identity = UTF8Encoding.UTF8.GetBytes(confItem.ResponseServerID); 
      Console.WriteLine("Server ID:" + confItem.ResponseServerID); 
      server.Connect(string.Format("tcp://{0}:{1}", "127.0.0.1", "5557")); 
      using (var poller = new NetMQPoller { server }) 
      { 
       server.ReceiveReady += (s, a) => 
        { 
         byte[] response = null; 
         NetMQMessage serverMessage = null; 
         try 
         { 
          serverMessage = a.Socket.ReceiveMultipartMessage(); 
         } 
         catch (Exception ex) 
         { 
          Console.WriteLine("Exception on ReceiveMultipartMessage : " + ex.ToString()); 
          //continue; 
         } 
         byte[] eaBody = null; 
         string clientAddress = ""; 
         if (serverMessage.FrameCount == 2) 
         { 
          clientAddress = serverMessage[0].ConvertToString(); 
          Console.WriteLine("ClientAddress:" + clientAddress); 
          eaBody = serverMessage[1].ToByteArray(); 
          Console.WriteLine("Received message from remote computer: {0} bytes , CurrentID : {1}", eaBody.Length, confItem.ResponseServerID); 
         } 
         else 
         { 
          Console.WriteLine("Received message from remote computer: CurrentID : {0}", confItem.ResponseServerID); 
         } 
        }; 
       poller.Run(); 
      } 
     } 

Est-il possible de choisir un backend spécifique sur frontend.ReceiveReady? Merci!

+0

Pouvez-vous inclure aussi le code des travailleurs? – somdoron

+0

Bonjour. J'ai inclus les codes du client et du concessionnaire sur votre demande. Merci d'avance. J'attends ta réponse. – user1892777

Répondre