【问题标题】:Best way to recover a server from a client's disconnect从客户端断开连接中恢复服务器的最佳方法
【发布时间】:2011-11-09 11:35:04
【问题描述】:

我已经用 Java 编写了一个 tcp 服务器。它生成工作实例(可运行)并侦听传入的 tcp 连接。从客户端连接后,它将从客户端获取数据并进行自己的处理。

最近,我注意到在客户端断开连接时,整个服务器将崩溃并出现错误 java.net.SocketException: Connection reset when the client disconnects or quits。这是当我意识到我没有针对所有失败实例彻底测试 tcp 服务器的时候。

我查看了代码,发现 tcp 服务器将在此行崩溃 while((bytesRead.... -1) 在工作实例中

final int BUFFSIZE = 65535;
int bytesRead;
byte[] buffer = new byte[BUFFSIZE];
din = new BufferedInputStream(clientSocket.getInputStream());

while ((bytesRead = din.read(buffer)) != -1) {   //tcp server crashes at this line if client quits or disconnects.
// worker does its job.
}

我一直在思考在不导致 tcp 服务器崩溃的情况下关闭 worker 实例的最佳方法。我无权访问客户端源代码来修改他们的任何内容。

有什么想法吗?

布雷格斯 养乐多121

【问题讨论】:

  • 它叫try {} catch () {}...
  • 您好,nfechner,如何将 try catch 合并到 while 语句中?
  • 不确定 Java read(),(因此这是一个注释),但在其他一些语言中,read() 会提前返回 bytesRead 为 0。由于您与 -1 进行比较,因此然后工作代码将在没有字节的情况下执行 - 几乎可以肯定会在某处引发异常。

标签: java multithreading sockets


【解决方案1】:

如果您想处理异常,网络 I/O 应该在 try/catch 块中完成。

【讨论】:

  • 嗨大卫,我应该如何将 try/catch 块合并到 while 语句中?我很困惑。
  • 这取决于代码的结构。但是您会希望每个网络 I/O 语句都位于“try”块内。也许是一个大的。也许很多小家伙。这取决于。
  • 嗯好的。我可能会使用相同的代码并测试包含 while 循环的 try/catch。
【解决方案2】:

如果连接关闭,此行应抛出 IOException。只要确保捕获 IOException 并在它发生时从 Runnable 的 run() 方法返回。这将停止处理此客户端连接的线程。

但是,如果它使整个服务器崩溃,那么您一定是做错了什么。这可能意味着每个客户端连接没有一个线程,而是一个线程依次处理客户端,一次一个。发布服务器代码以获取更多信息。

【讨论】:

  • 您好 JB Nizet,我会在今晚晚些时候回家后发布更多信息。我曾尝试使用至少两个并发客户端连接到 tcp 服务器,它运行良好。但是当我关闭两个客户端之一时,TCP 服务器就死了。
【解决方案3】:

解决了问题。写下我为任何想要解决同样问题的人所做的事情。

private boolean isStopped = false;

while (!isStopped()) {
   try {
      while ((bytesRead = din.read(buffer)) != -1) {   
         // worker does its job.
      }
   }
   catch (IOException ex) {
      System.out.println("Exception called! Most likely due to client disconnect!");
      stop();
   }
}

public boolean isStopped() {
    return this.isStopped;
} 

public synchronized void stop(){
    this.isStopped = true;
}

【讨论】:

  • 您可以通过使用 break 语句摆脱 isStopped()、stop() 和 this.isStopped()。不要让生活变得比现在更艰难。此外,当您捕获异常时,请始终打印 its 消息。不要只是自己编造。
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2020-07-21
  • 2012-05-02
  • 2014-01-22
  • 1970-01-01
  • 2020-05-26
相关资源
最近更新 更多