有关问题的说明。
目前我正在开发服务器 - csharp中的多个客户端(超过3000个客户端)应用程序。服务器和客户端交换消息。问题是如果任何客户端因内部原因崩溃,服务器会崩溃。内部原因可能包括客户端计算机的所有特定问题。例如,它们可能是丢失的互联网连接,计算机崩溃,电源故障等。
由于服务器用于传递实时信息,如果服务器崩溃,则整个操作停止。这对服务器来说是噩梦,因为我们无法预测哪个客户端会崩溃。
导致服务器崩溃的主要代码如下:
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数据包,几乎不可能检测到半开连接(断开连接)。
在我们的应用程序中,我们不喜欢使用Keep alive数据包或消息,因为服务器和客户端在几毫秒内通信。每秒从超过3000个客户端接收保持活动包或消息对于服务器的资源管理观点来说似乎不友好。所以我们更喜欢有一个很好的错误管理。如果客户端计算机崩溃了,那么我们只想忽略。我不确定这是否会使正在运行的服务器不稳定?
无论如何,我想出了以下选项的一些想法。其他编码员的建议大部分时间都在网上。所以问题是哪个选项可能最好安全地捕获Socket.Send()失败错误并且不会干扰服务器的操作?
使用简单的try catch语句。这会为这个问题提供100%安全的故障安全操作吗?根据我的经验,有时,它有效,但有时它不起作用。
try
{
mSocket.Send(buffer);
return (true);
}
catch(System.Net.Sockets.SocketException ex)
{
mSocket = null;
return (false);
}
使用while(true)循环。有人提到虽然(真)循环可能是这样做的安全方式。但是,我不确定此解决方案与简单的try catch语句相比有多有效。
在其他线程而不是主线程中执行Socket.Send()函数。这个想法是,如果Socket.Send()函数失败,那么用于Socket.send()函数的线程将自行终止,而不会干扰应用程序的主线程。但是,我没有充分了解每个线程如何相互作用。所以我不知道这种方法是否比上述两种方法更好。
您能为这个具体问题提出任何想法或解决方案吗?我认为如果不使用Keep alive数据包,维护服务器操作而不会崩溃是一个非常具有挑战性的问题。