【问题标题】:client-server question客户端-服务器问题
【发布时间】:2011-05-26 18:50:52
【问题描述】:

如果我有一个连接到服务器的客户端并且如果服务器崩溃,我如何确定,形成我的客户端,如果连接断开?这个想法是,如果在我的客户的while 中,我等待从我的服务器(String a = sr.ReadLine();)读取一行,而当客户端等待接收该行时,服务器崩溃,我如何关闭包含我的@的线程987654323@ ?

很多人告诉我,在那个 while(alive) { .. } 中,我应该将 alive 值更改为 true ,但如果我的程序当前正在等待读取一行,它不会退出 while 因为它会被困住在sr.ReadLine()

我在想,如果我不能向服务器发送一条线,我应该用 .abort() 关闭客户端线程。有任何想法吗 ?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    ReadLine 方法中有一个TimeOut 参数,该参数采用TimeSpan 值,如果未收到响应,则在该间隔后超时..

    public string ReadLine(TimeSpan timeout)
    {
       // ..your logic.
    )
    

    例如,检查这些 SO 帖子 -

    Implementing a timeout on a function returning a value

    Implement C# Generic Timeout

    【讨论】:

    • 你有这方面的例子吗?
    • 查看更新的答案,我刚刚发现一些 SO 帖子提供了很好的示例。
    【解决方案2】:

    服务器应用程序是您自己的,还是现成的?

    如果是您的,请每隔几秒发送一次“心跳”,让客户端知道连接和服务仍然存在。 (这比仅查看连接是否关闭更可靠,因为在服务器应用程序锁定时连接可能保持打开状态。)

    【讨论】:

    • 您的意思是“心跳”吗?这是我老板最喜欢的流行语/阶段之一。
    【解决方案3】:

    如果服务器崩溃,我想你会遇到更多的问题,而不仅仅是修复一个 while 循环。由于其他原因,您的程序可能会进入不稳定状态。状态不容忽视。话虽如此,一个不错的“服务器超时”消息可能就足够了。您可以更进一步并 ping,然后给出更高级的消息“服务器似乎已关闭”。

    【讨论】:

      【解决方案4】:

      服务器崩溃与您的客户端无关。有几个外部因素会导致连接中断:客户端是其中之一,互联网/局域网问题是另一个。

      不管为什么失败,服务器都应该处理它。服务器宕机会让你的用户尖叫;)

      关于多线程,我建议你看看 BeginXXX/EndXXX 异步方法。它们为您提供更强大的功能和更强大的解决方案。

      【讨论】:

        【解决方案5】:

        尽量避免任何依赖线程 abort() 的策略。如果您无法避免,请确保您了解该机制的惯用语,这涉及拥有一个单独的 appdomain 并捕获 ThreadAbortException

        【讨论】: