2014-12-03 90 views
0

我有一個簡單的應用程序發送和接收數據。如何使用ZeroMQ接收數據?

ZSocketExample client = new ZSocketExample("127.0.0.1:5555"); 
client.send("test"); 

這是我的客戶端類:

public class ZSocketExample:IDisposable 
{ 
    public delegate void ReceiveEventHandler(object sender, SocketEventArgs e); 

    public event ReceiveEventHandler ReceiveEvent; 
    private ZmqContext zmqContext; 
    private ZmqSocket zmqSocket; 
    private string host; 
    private bool isRunning; 
    private bool disposed = false; 

    public ZSocketExample(string host) 
    { 
     try 
     { 
      zmqContext = ZmqContext.Create(); 
      zmqSocket = zmqContext.CreateSocket(SocketType.DEALER); 
      ZHelpers.SetID(zmqSocket, Encoding.UTF8); 
      zmqSocket.Connect(host); 
      this.isRunning = true; 

      zmqSocket.ReceiveReady += new EventHandler<SocketEventArgs>(zmqSocket_ReceiveReady); 
      zmqSocket.SendReady += new EventHandler<SocketEventArgs>(zmqSocket_SendReady); 

      Poller poller = new Poller(new List<ZmqSocket> { zmqSocket }); 

      while (isRunning) 
      { 
       poller.Poll(TimeSpan.FromSeconds(5)); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    void zmqSocket_ReceiveReady(object sender, SocketEventArgs e) 
    { 
     Console.WriteLine("Receive Ready"); 
    } 

    void zmqSocket_SendReady(object sender, SocketEventArgs e) 
    { 
     Console.WriteLine("Send Ready"); 
    } 

    public void send(string msg) 
    { 
     zmqSocket.Send(msg, Encoding.UTF8); 

     if (ReceiveEvent != null) 
      ReceiveEvent(this, null); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed) 
      return; 

     if (disposing) 
     { 
      close(); 
     } 

     disposed = true; 
    } 

    public void close() 
    { 
     isRunning = false; 
     zmqSocket.Linger = TimeSpan.FromSeconds(1); 
     zmqSocket.Close(); 
     zmqContext.Terminate(); 
    } 
} 

但不知何故,它亙古不變的發送或接收。有人能告訴我我做錯了什麼嗎?這個例子阻止了主應用程序。我怎樣才能使它不被阻塞?

回答

3

ZeroMQ套接字不是線程安全的,不能使用多線程而不使用某種同步。

在你的例子中,你調用close來設置一個變量,然後立即關閉套接字,這是錯誤的,當你不在while循環時應該關閉套接字。

關於接收/發送準備就緒,您很少需要註冊發送準備好,發送準備就會讓您知道何時可以發送消息,在發牌者套接字中,如果您已連接,則始終會準備發送(除非高水已達)。

當準備好接收消息時,如果另一方向您發送一條消息,準備就緒將被調用,則接收就緒將被調用。

對於最後一部分,阻塞,您需要一個專門的線程來處理zeromq套接字,您可以擁有一個使用該輪詢器來處理多個套接字的線程。

+0

是否有任何已知的模式創建單個連接併發送/ recvs在線程或異步? – 2014-12-08 00:02:08

+0

與您所熟悉的方式不同,zeromq在如何執行多線程方面有不同的方法,在覈心上,您不會在線程之間共享任何內容並只發送消息。您可以查看指南中的majordomo示例。 – somdoron 2014-12-08 09:52:12

+0

也許我應該切換到NetMQ。你可以告訴我,如果它可能與NetMQ? – 2014-12-08 15:54:12