如果我有一个连接到服务器的客户端,如果服务器崩溃,我如何确定,如果连接已关闭,请形成我的客户端?我的想法是,如果在我的客户端while
我等待从我的服务器(String a = sr.ReadLine();
)读取一行,当客户端等待接收该行时,服务器崩溃,我该如何关闭该线程包含我的while
?
许多人告诉我,在while(alive) { .. }
中我应该将alive值更改为true,但是如果我的程序当前正在等待读取行,那么它将无法退出,因为它会被困在sr.ReadLine()
。
我在想,如果我不能向服务器发送一行,我应该用.abort()
关闭客户端线程。有任何想法吗 ?
答案 0 :(得分:2)
在TimeOut
方法中有一个ReadLine
参数,如果没有收到回复,则会在该时间间隔后取TimeSpan
个值并超时..
public string ReadLine(TimeSpan timeout)
{
// ..your logic.
)
例如,查看这些SO帖子 -
答案 1 :(得分:1)
服务器应用程序是您自己的,还是现成的东西?
如果是您的,请每隔几秒发送一次“心跳”,让客户知道连接和服务仍然存在。 (这比仅查看连接是否关闭更可靠,因为在服务器应用程序被锁定时,连接可能会保持打开状态。)
答案 2 :(得分:0)
如果服务器崩溃,我想你会遇到更多问题而不仅仅是修复一个while循环。由于其他原因,您的程序可能会进入不稳定状态。国家不应该被忽视。话虽这么说,一个很好的“服务器超时”消息可能就足够了。您可以更进一步并ping,然后给出稍微更高级的消息“服务器似乎已关闭”。
答案 3 :(得分:0)
服务器崩溃与您的客户无关。有几个外部因素可以使连接失败:客户端就是其中之一,互联网/局域网问题是另一个。
无论为何失败都无关紧要,服务器无论如何都应该处理它。服务器停机会让你的用户尖叫;)
关于多线程,我建议您查看BeginXXX / EndXXX异步方法。它们为您提供更强大的功能和更强大的解决方案。
答案 4 :(得分:0)
尽量避免任何依赖线程中止()的策略。如果你无法避免它,请确保你理解该机制的习惯用法,包括拥有一个单独的appdomain并捕获ThreadAbortException