我正在处理一个客户端/服务器关系,旨在无限期地推送数据。
我试图解决的问题是在客户端方面,即我找不到一种方法来检测断开连接。
我尝试了其他人提供的几种解决方案,包括捕获IO异常,以及在所有三个SelectModes上轮询套接字。我还尝试结合使用轮询和检查套接字的“Available”字段。
// Something like this
Boolean IsConnected()
{
try
{
bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
bool part2 = (this.Connection.Client.Available == 0);
if (part1 & part2)
{
// Never Occurs
//connection is closed
return false;
}
return true;
}
catch( IOException e )
{
// Never Occurs Either
}
}
在服务器端,尝试向客户端写入一个“空”字符(\0)会导致IO异常,服务器可以检测到客户端已断开连接(非常容易)。在客户端上,同样的操作不会抛出异常。// Something like this
Boolean IsConnected( )
{
try
{
this.WriteHandle.WriteLine("\0");
this.WriteHandle.Flush();
return true;
}
catch( IOException e )
{
// Never occurs
this.OnClosed("Yo socket sux");
return false;
}
}
我认为在通过轮询检测断开连接时遇到的问题是,如果自上次检查以来服务器还没有向客户端写回任何内容,那么我很容易遇到SelectRead返回false的情况...我不确定该怎么办,我已经追寻了每一个可用的选项来进行检测,但没有一种方法对我来说是100%有效的,最终我的目标是检测服务器(或连接)故障,通知客户端,等待重新连接等。所以你可以想象这是一个非常重要的部分。
感谢任何人的建议。 提前感谢您。
编辑:任何查看此问题的人都应注意下面的答案及我的最终评论。我已经详细阐述了如何解决这个问题,但还没有写成“问答”形式的帖子。