我正在处理客户端/服务器关系,该关系旨在在不确定的时间内来回推送数据。
我试图克服的问题是在客户端,因为我无法找到一种方法来检测断开连接。
我对其他人的解决方案进行了几次尝试,从捕获 IO 异常到在所有三个 SelectMode 上轮询套接字。我也尝试过使用轮询的组合,并检查套接字的“可用”字段。
// 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 异常,并且服务器可以检测到客户端已断开连接(非常容易 gig)。
在客户端,同样的操作不会产生异常。
// 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 上遇到错误...确定要在这里做什么,我已经找到了每个选项来进行我能找到的检测,但对我来说没有任何事情是 100% 的,最终我的目标是检测服务器(或连接)故障,通知客户端,等待重新连接,等等。所以我相信你可以想象这是一个不可或缺的部分。
欣赏任何人的建议。提前谢谢。
编辑:任何查看这个问题的人都应该注意下面的答案,以及我对它的最终评论。我已经详细说明了我是如何克服这个问题的,但还没有发表“问答”风格的帖子。