2014-12-03 75 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

相关问题