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