C# TcpListeneR语言 客户端数量有限



亲爱的堆栈溢出社区,

我目前正在开发一个 C# 的在线 TCG。服务器在我自己的机器(四核,八线程Windows 7)上运行良好。我可以毫无问题地连接 12 个客户端。但是当我在服务器上启动它时,最大客户端数量将限制为计算机上的处理器内核数。我在单核Windows 2016服务器上运行代码,无法连接多个客户端来启动游戏。然后我在四核Windows 2012服务器上运行服务器,只能连接四个客户端并启动两个游戏。任何进一步的客户端都会被完全忽略,直到有人断开连接。然后新客户端被接受并且服务器崩溃。

该服务器是带有.NET Framework 4.0的MS Visual Studio 2015 Windows Forms Application。Windows Server 机器有 .NET Framework 4.0,我自己的机器有 4.5 版。

我很乐意提供您可能需要的任何其他信息并回答您的所有问题。

C# 中的服务器代码:

public void Init()
{
try {
server = new TcpListener(IPAddress.Any, port);
server.Start();
serverRunning = true;
server.BeginAcceptTcpClient(AcceptTcpClient, server);
OutputTB.Text = "server has been started on port " + port.ToString();
}
catch (Exception e) {
OutputTB.Text = "socket error: " + e.Message;
}
}
private void AcceptTcpClient(IAsyncResult newClient)
{
if (!serverRunning)
return;
server.BeginAcceptTcpClient(AcceptTcpClient, server);
TcpListener listener = (TcpListener)newClient.AsyncState;
ServerClient client = new ServerClient(listener.EndAcceptTcpClient(newClient));
Send("SWHO", client);
connectedClients.Add(client);
Invoke((MethodInvoker)delegate {
ClientListBox.Items.Add("Waiting for authentification...");
});
NetworkStream stream = client.tcp.GetStream();
StreamReader reader = new StreamReader(stream, true);
while (client.connected && serverRunning) {
if (stream.DataAvailable) {
string data = reader.ReadLine();
if (data != null)
OnIncomingData(client, data);
}
}
Invoke((MethodInvoker)delegate {
if (client.authenticated)
ClientListBox.Items.Remove(client.playerName);
else
ClientListBox.Items.Remove("Waiting for authentification...");
});
Send("SDISC", client);
waitingClients.Remove(client);
connectedClients.Remove(client);
client.tcp.Close();
}
private void OnIncomingData()
{
//process client data
}

线程池耗尽了!非常感谢itsme86和usr的有用提示。现在代码如下所示:

private void AcceptTcpClient(IAsyncResult ar)
{
server.BeginAcceptTcpClient(AcceptTcpClient, server);
Task.Run(() => ListenToIncomingData(IAsyncResult ar);
}

有一件事我很好奇:异步调用不也消耗线程吗? 为什么有足够的资源来处理它,但没有足够的资源来处理未完成的回调?

最新更新