Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环时NetMQ接收/响应不工作_C#_Sockets_While Loop_Connection_Netmq - Fatal编程技术网

C# 循环时NetMQ接收/响应不工作

C# 循环时NetMQ接收/响应不工作,c#,sockets,while-loop,connection,netmq,C#,Sockets,While Loop,Connection,Netmq,我在上举了一个简单的接收/请求套接字示例,希望它能够在无限循环中使用ParameterizedThread。 代码在几个循环中运行良好,然后抛出 无法立即完成非阻塞套接字操作 对于我得到的,上面的内容应该在第一个循环之后立即发生,而不是随机发生。这里的问题是什么?听起来,为了再次获得干净的连接(不确定),必须清除某些内容 NetMQSockets不是线程安全的,您正在从客户端线程内部访问服务器以发送/接收数据。客户端无论如何都不应该有权访问服务器套接字 首先,将绑定移到while循环之外,它只需

我在上举了一个简单的接收/请求套接字示例,希望它能够在无限循环中使用ParameterizedThread。 代码在几个循环中运行良好,然后抛出

无法立即完成非阻塞套接字操作

对于我得到的,上面的内容应该在第一个循环之后立即发生,而不是随机发生。这里的问题是什么?听起来,为了再次获得干净的连接(不确定),必须清除某些内容


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

首先,将绑定移到while循环之外,它只需要一次,而不是为创建的每个客户机。 要等待消息使用,它将为您处理所有其他事情,并在收到消息后引发servers 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);
    }
}
static void Main(字符串[]args){
字符串连接=”tcp://localhost:5555";
使用(var poller=new NetMQPoller()){
使用(var server=newresponsesocket()){
server.ReceiveReady+=服务器\u ReceiveReady;
poller.Add(服务器);
poller.RunAsync();
绑定(连接);
//启动10000个客户端
对于(int i=0;i<10000;i++){
ParameterizedThreadStart ParameterizedClient线程=新的ParameterizedThreadStart(runClientSide);
线程t=新线程(参数化客户端线程);
t、 启动(连接);
}
Console.ReadLine();//让服务器运行,直到用户按Enter键
}
}
}
//服务器(如Socket)正在这里接收数据并可以应答
私有静态void服务器\u ReceiveReady(对象发送方,NetMQSocketEventArgs e){
string fromClientMessage=e.Socket.ReceiveFrameString();
WriteLine(“来自客户端:{0}”,来自客户端消息);
e、 Socket.SendFrame(“Hi-Back”);
}
私有静态void runClientSide(对象参数){
字符串连接=(字符串)参数;
使用(var client=new RequestSocket()){
client.Connect(连接);
client.SendFrame(“你好”);
//删除此处的服务器端代码并将其放入ReceiveReady事件
string fromServerMessage=client.ReceiveFrameString();
WriteLine(“来自服务器:{0}”,来自服务器消息);
}
}

您只能使用同一端口号打开与服务器的一个连接。您必须在打开新连接之前关闭连接,或者不要在每条消息之后关闭连接。while循环看起来错误。不确定问题是否为循环。事实上,如果删除ParameterizedThread部分并使用注释掉的方法(修改下面的输入参数),代码在循环中运行良好。据我所知,请求/响应不是线程安全的。不确定出了什么问题。main()方法与线程不在同一进程中,它是跨线程的,需要使用“Invoke”在两个进程之间传输数据。不需要对任何东西调用
Invoke
。我猜你说的是Windows窗体应用程序,更新UI时需要用到它。事实上,这是一种从每个客户机内部跨线程访问服务器套接字的方法。谢谢,我现在知道我做错了什么。非常感谢您的帮助!
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);
    }
}