c# - 等待连接的正确方法是什么?

标签 c# zeromq netmq

我正在尝试使用 NetMQ 在两个应用程序之间实现一个简单的消息传递(下面是对我想要实现的目标的更详细的描述)。
经过一些尝试和错误后,我发现我不能在 Connect/Bind 调用后立即发送或接收消息,因为它们是非阻塞的,即使连接尚未建立也会实际返回。< br/> 现在我用 Thread.Sleep() 解决了这个问题,但这有不好的味道,绝对不适合生产系统。

所以问题是,应该如何在 NetMQ/ZeroMQ 中做到这一点?

客户端示例:

        using (NetMQContext ctx = NetMQContext.Create())
        {
            using (var client = ctx.CreatePushSocket())
            {
                client.Connect("tcp://127.0.0.1:5555");
                Thread.Sleep(100); // wait for connection

                for (int i = 0; i < 5; i++) 
                {
                    client.Send("test " + i , true);
                }
            }
        }
    }

服务器示例:

    using (NetMQContext ctx = NetMQContext.Create())
    {
        using (var server = ctx.CreatePullSocket())
        {
            server.Bind("tcp://127.0.0.1:5555");
            Thread.Sleep(100); // wait for connection
            while (true)
            {
                var str = server.ReceiveString();
                Console.Out.WriteLine(str);
                Thread.Sleep(60*1000); // do msg processing
            }
        }
    }

我要实现的目标的描述:

客户端 - 将消息发送到单个服务器。当服务器不可用时,客户端不应阻塞也不应丢弃消息。客户端可以随时离线/在线。

服务器 - 从单个客户端接收消息。服务器阻塞,直到收到消息。服务器需要对消息进行冗长的处理,并且在处理时不应丢失任何其他消息。服务器可以随时离线/在线。

最佳答案

接收和发送都可以等待直到可以执行,你在你的例子中将 true 传递给了 dontWait 参数,只需删除它,它就会在可以的时候发送消息。

对于接收,您不必休眠,因为它会等到消息可用。

正如建议的那样,使用 Poller 也是一种解决方案(您可以轮询套接字何时可以发送以及何时可以使用消息),看看轮询类的测试:https://github.com/zeromq/netmq/blob/3.3.3-rc5/src/NetMQ.Tests/PollerTests.cs .

关于c# - 等待连接的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22715840/

相关文章:

c# - 从代理返回异常

c# - 使用 HttpWebRequest.GetResponse() 抓取屏幕时出现错误 "The remote server returned an error: (403) Forbidden"

c# - WPF 将枚举列表(或类似列表)绑定(bind)到复选框列表

c++ - 使用 Boost 发送序列化结构但出现输入流错误

zeromq - ZeroMQ模式,用于基于空闲状态在工作人员之间进行负载均衡工作

c# - 通过 nuget 将 NetMQ 安装到 xamarin 项目时出错

c# - 我们如何在 C# 中获取异步方法名称

c++ - 在 Linux 上链接 Zeromq 库的 Makefile 问题

zeromq - PUB/SUB 我可以在 .bind() 之前先 .connect() 吗?