C# 如何在客户端内部崩溃时停止服务器崩溃(TCP/IP套接字)
关于问题的描述 目前,我正在csharp中开发服务器多客户端(超过3000个客户端)应用程序。服务器和客户端交换消息。问题是,如果任何客户端由于内部原因崩溃,服务器就会崩溃。内部原因可能包括客户端计算机的各种特定问题。例如,它们可能是失去互联网连接、计算机崩溃、电源故障等 由于服务器的功能是传递实时信息,如果服务器崩溃,则整个操作将停止。这对于服务器来说是一场噩梦,因为我们无法预测哪个客户端将崩溃 导致服务器崩溃的主要代码如下:C# 如何在客户端内部崩溃时停止服务器崩溃(TCP/IP套接字),c#,sockets,tcp,server,client,C#,Sockets,Tcp,Server,Client,关于问题的描述 目前,我正在csharp中开发服务器多客户端(超过3000个客户端)应用程序。服务器和客户端交换消息。问题是,如果任何客户端由于内部原因崩溃,服务器就会崩溃。内部原因可能包括客户端计算机的各种特定问题。例如,它们可能是失去互联网连接、计算机崩溃、电源故障等 由于服务器的功能是传递实时信息,如果服务器崩溃,则整个操作将停止。这对于服务器来说是一场噩梦,因为我们无法预测哪个客户端将崩溃 导致服务器崩溃的主要代码如下: public bool Send(byte[] buffe
public bool Send(byte[] buffer)
{
if (m_Socket == null)
{
return (false);
}
try
{
mSocket.Send(buffer);
return (true);
}
catch(System.Net.Sockets.SocketException ex)
{
mSocket = null;
return (false);
}
return (false);
}
我认为从我的研究中,类似的问题几乎没有答案。然而,答案经常指出使用保持活动的数据包
我认为这个网站上的许多答案表明,如果不使用来自客户端的keep-alive数据包,检测半开放连接(断开连接)几乎是不可能的
在我们的应用程序中,我们不喜欢使用Keep-alive数据包或消息,因为服务器和客户端的通信时间是毫秒。从服务器的资源管理角度来看,每秒从3000多个客户端接收keep-alive数据包或消息似乎并不友好。因此,我们希望有一个相当好的错误管理。如果客户端计算机崩溃,那么我们只想忽略它。我不确定这是否会使正在运行的服务器不稳定
不管怎么说,我想出了一些关于以下选项的想法。大多数时候,这是来自网络上其他程序员的建议。因此,问题是哪一个选项可能是安全捕获Socket.Send()失败错误和不干扰服务器操作的最佳选项
try
{
mSocket.Send(buffer);
return (true);
}
catch(System.Net.Sockets.SocketException ex)
{
mSocket = null;
return (false);
}
你能为这个具体问题提出一些想法或解决方案吗?我认为,如果不使用Keep-alive数据包,在不崩溃的情况下维护服务器操作是一个非常具有挑战性的问题。Catch
Exception
而不是SocketException
,这将确保服务器永远不会崩溃。另外,请确保读取循环受到try/Catch的保护。谢谢您的评论。什么是读取循环?在服务器上,您是在循环中读取还是使用异步事件读取?我使用异步事件。