【问题标题】:how to trace that client is disconnected?如何跟踪该客户端已断开连接?
【发布时间】:2011-04-04 18:40:47
【问题描述】:

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

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

【问题讨论】:

  • 这里有很多才华横溢的女士/女孩,最好不要将她们排除在回答之外:)
  • 糟糕——你还没有标记你的问题,指定你正在使用的技术。 C#/Java/ASP.NET/sockets/remoting/web?试着问具体的问题,包括你已经尝试过的和出了什么问题。
  • 你用哪个类处理连接?
  • @Kieren:对不起。我不是这个意思。下次我会使用先生/女士... :)

标签: c#


【解决方案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,您几乎必须注销整个套接字。

【讨论】:

  • 使用套接字。实际上,我不想让服务器忙于执行计时器或循环以跟踪客户端连接。所以需要一些只有在任何客户端断开连接时才执行的东西。示例:在您的房子里,您不会一次又一次地检查您的门是否有人在那里。当有人在那里时很简单,他/她必须敲门,然后你必须去开门。同样,如果有人离开你家,他/她会通知你我要离开。一次又一次地看到你的家人出现在房间里是不公平的。
  • 很遗憾没有“断开连接”事件,请看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
相关资源
最近更新 更多