c# - NetMQ接收/响应在循环时不起作用

标签 c# sockets while-loop connection netmq

我在https://netmq.readthedocs.io/上采用了一个简单的接收/请求套接字示例,并希望使其在无限循环中与parametrizedThread一起使用。
该代码在少数循环中工作正常,之后将引发

A non-blocking socket operation could not be completed immediately



对于我来说,以上应该在第一个循环后立即发生,而不是随机发生。这是什么问题?听起来有些东西必须冲掉才能重新获得干净的连接(不确定)。
    class Program
{
    public class Connector
    {
        public String connection { get; set; }
        public ResponseSocket server { get; set; }

        public Connector(string address, ResponseSocket server_)
        {
            this.connection = address;
            this.server = server_;
        }
    }

    static void Main(string[] args)
    {
        string connection = "tcp://localhost:5555";
        using (var server = new ResponseSocket())
        {
            while (true)
            {
                try
                {
                    server.Bind(connection);
                }
                catch (NetMQException e)
                {
                    Console.WriteLine(e.ErrorCode);
                }

                Connector c = new Connector(connection, server);

                ParameterizedThreadStart parametrizedClientThread = new ParameterizedThreadStart(runClientSide);
                Thread t = new Thread(parametrizedClientThread);
                t.Start(c);
                //runClientSide(connection, server);
            }
        }
    }

    private static void runClientSide(object param)
    {
        Connector conn = (Connector)param;
        string connection = conn.connection;
        ResponseSocket server = conn.server;
        using (var client = new RequestSocket())
        {
            client.Connect(connection);
            client.SendFrame("Hello");

            string fromClientMessage = server.ReceiveFrameString();
            Console.WriteLine("From Client: {0}", fromClientMessage);
            server.SendFrame("Hi Back");

            string fromServerMessage = client.ReceiveFrameString();
            Console.WriteLine("From Server: {0}", fromServerMessage);

            //Console.ReadLine();
        }
    }

最佳答案

NetMQSockets不是线程安全的,您正在从客户端线程内部访问服务器以发送/接收数据。无论如何,客户端都不应该访问服务器套接字。

首先,将Bind移到while循环之外,只需要一次,而不是为每个创建的客户端都需要一次。
要使用NetMQPoller等待消息,它将在收到消息后为您处理其他所有事务,并引发服务器ReceiveReady事件。

static void Main(string[] args) {
    string connection = "tcp://localhost:5555";
    using (var poller = new NetMQPoller()) {
        using (var server = new ResponseSocket()) {
            server.ReceiveReady += Server_ReceiveReady;
            poller.Add(server);
            poller.RunAsync();

            server.Bind(connection);

            // start 10000 clients
            for(int i = 0; i < 10000; i++) {

                ParameterizedThreadStart parametrizedClientThread = new ParameterizedThreadStart(runClientSide);
                Thread t = new Thread(parametrizedClientThread);
                t.Start(connection);
            }

            Console.ReadLine(); //let server run until user pressed Enter key
        }
    }
}

//server (e.Socket) is receiving data here and can answer it
private static void Server_ReceiveReady(object sender, NetMQSocketEventArgs e) {
    string fromClientMessage = e.Socket.ReceiveFrameString();
    Console.WriteLine("From Client: {0}", fromClientMessage);
    e.Socket.SendFrame("Hi Back");
}

private static void runClientSide(object param) {
    string connection = (string) param;

    using (var client = new RequestSocket()) {
        client.Connect(connection);
        client.SendFrame("Hello");

        //Removed server side code here and put it into ReceiveReady event

        string fromServerMessage = client.ReceiveFrameString();
        Console.WriteLine("From Server: {0}", fromServerMessage);
    }
}

关于c# - NetMQ接收/响应在循环时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639326/

相关文章:

.net - 带有取消 token 的 NetworkStream.ReadAsync 永远不会取消

php - 我的 mysql_fetch_array() 循环不输出任何答案。有什么建议么?

c# - Directshow录制/预览问题

c# - 图表不会得出我的观点

通过 Socket 的 Java Swing 定时器同步

java - 测试表的最大值时出错?

java - 有没有办法在原始条件为假之前跳出 while 循环?

c# - 显示名称属性与显示属性

c# - 服务器无法在发送 HTTP header 后附加 header c# pdf inline

c - Telnet拒绝简单TCP服务器上的连接