如何跟踪客户端是否已断开连接?

时间:2011-04-04 09:36:18

标签: c#

在客户端服务器应用程序中,客户端连接到服务器,现在如果客户端断开连接,那么我希望它必须在服务器上触发事件,通知它已断开连接。我可以使用计时器或一些循环和不同的线程来实现这一点。该线程不断检查客户端的连接。这就对了。但它就像一个投票机制。我想写一些类似中断机制的东西。我的意思是我不想使用计时器或循环。当客户端自愿或不情愿地从客户端或服务器端断开连接时,我的服务器应该通知客户端已断开连接。请不要告诉我们如何制作自定义活动。

(几分钟前我问了同样的问题,但找不到正确的答案,论坛也关闭了问题......)

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您是在谈论ASP.NET(或其他Web内容),使用套接字进行直接通信,远程处理,WCF还是其他东西。请澄清你是否可以。

您似乎在谈论民意调查与事件驱动系统。确切的实现和细节取决于上面的问题。 “请不要告诉如何制作自定义事件”没有多大意义:您似乎不想轮询,根据具体情况,您可能需要创建自定义事件。


根据您使用套接字的事实进行更新:

没有被触发的事件,使用套接字只会导致读取,写入等调用失败并显示SocketException

请参阅此处了解更多信息:

Instantly detect client disconnection from server socket

你可以为此创建自己的事件,如果你的套接字是在另一个线程中处理的,例如,你的线程方法看起来像这样:

bool running = true;
while (running)
{
    try
    {
        // do socket work here - read/write/etc
    }
    catch (SocketException)
    {
        // something happened, e.g. client disconnected. stop thread running.
        // you could fire your 'Disconnected' event here.
        running = false;
    }
}

基本上,当客户端断开连接时,套接字方法将抛出SocketException,并且您可以检查异常对象的SocketError属性。它将是以下之一:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketerror.aspx

这些结果表明一个断开连接的客户端:ConnectionReset,NotConnected ...但如果你得到任何SocketException,你几乎必须注销整个套接字。