我在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/