NetMQ Version: 4.0.0.239-pre
Operating System: Linux / Windows
.NET Version: NET Core 2.1
嗨 我有一个多客户端/单服务器方案,我围绕Dealer / Router套接字建模。 我正在尝试将1000个客户端连接到服务器,但是服务器能够接受第一个250-350。
服务器接受的连接数上限为250-350。
客户端代码
public class NetMQClient
{
DealerSocket client = new DealerSocket("tcp://127.0.0.1:25702");
NetMQQueue<NetMQMessage> messageQueue = new NetMQQueue<NetMQMessage>();
public NetMQClient ()
{
messageQueue.ReceiveReady += MessageQueue_ReceiveReady;
client.Options.Backlog = 1000;
client.ReceiveReady += Client_ReceiveReady;
}
private void Client_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
while (e.Socket.TryReceiveFrameString(out string msg))
{
Console.WriteLine("REPLY From Server{0}", msg);
}
}
public void StartSending(int id)
{
client.Options.Identity = Encoding.Unicode.GetBytes(id.ToString());
var message = string.Format("Id = {0}", id.ToString());
var bytes = Encoding.ASCII.GetBytes(message);
using (var poller = new NetMQPoller())
{
poller.Add(client);
poller.Add(messageQueue);
poller.RunAsync();
var messageToServer = new NetMQMessage();
messageToServer.Append(message);
messageQueue.Enqueue(messageToServer);
}
}
private void MessageQueue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e)
{
while (e.Queue.TryDequeue(out NetMQMessage messageToServer, TimeSpan.FromMilliseconds(10)))
{
client.SendMultipartMessage(messageToServer);
}
}
}
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() =>
{
for (var i = 1; i <= 1000; i++)
{
var index = i;
Task.Factory.StartNew(() => new NetMQClient().StartSending(index));
}
});
Console.WriteLine("Press any key to finish!");
Console.ReadLine();
}
}
服务器代码
public class NetMQServer
{
static RouterSocket server;
public void StartListening()
{
Console.WriteLine("Started and listening");
server = new RouterSocket("@tcp://127.0.0.1:25702");
server.Options.Backlog = 1000;
server.ReceiveReady += Server_ReceiveReady;
using (var poller = new NetMQPoller())
{
poller.Add(server);
poller.RunAsync();
Console.ReadLine();
}
}
private void Server_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
var fromClientMessage = new NetMQMessage();
while (server.TryReceiveMultipartMessage(ref fromClientMessage))
{
var clientAddress = fromClientMessage[0];
var clientOriginalMessage = fromClientMessage[1].ConvertToString();
Console.WriteLine("From Client: {0}", clientOriginalMessage);
var messageToClient = new NetMQMessage();
messageToClient.Append(clientAddress);
messageToClient.Append(clientOriginalMessage);
e.Socket.SendMultipartMessage(messageToClient);
}
}
}
class Program
{
static void Main(string[] args)
{
var server = new NetMQServer();
Task.Factory.StartNew(() => server.StartListening());
Console.ReadLine();
}
}
有什么办法可以做到这一点,还是上面的代码有什么问题? 谢谢您的投入。
该问题也已作为问题发布在NetMQ项目github存储库(https://github.com/zeromq/netmq/issues/832)