gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:01:15 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com