【发布时间】: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