Java 如何处理socket程序中的连接重置错误
我已经写了下面给出的一个程序。它从客户机接收一些数据并返回成功响应。有时它抛出连接重置错误&由于该错误,某些套接字连接保持未关闭状态。当客户端代码尝试通信时,以及客户端自动关闭连接时,您知道如何处理连接重置错误吗Java 如何处理socket程序中的连接重置错误,java,sockets,error-handling,Java,Sockets,Error Handling,我已经写了下面给出的一个程序。它从客户机接收一些数据并返回成功响应。有时它抛出连接重置错误&由于该错误,某些套接字连接保持未关闭状态。当客户端代码尝试通信时,以及客户端自动关闭连接时,您知道如何处理连接重置错误吗 import java.net.*; import java.io.*; import java.util.logging.Level; import java.util.logging.Logger; public class tcp_server implements Runna
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class tcp_server implements Runnable {
private final Socket server;
private PrintWriter toClient = null;
private BufferedReader fromClient = null;
public tcp_server(Socket s) {
this.server = s;
}
@Override
public void run() {
String name = "";
synchronized (server) {
try {
server.setSoTimeout(6000);
toClient
= new PrintWriter(server.getOutputStream(), true);
fromClient
= new BufferedReader(
new InputStreamReader(server.getInputStream()));
String line = "";
String data = "";
while ((line = fromClient.readLine()) != null) {
data = data + line;
toClient.println("{status:success}");
break;
}
} catch (Exception eb) {
System.out.println("{status:error,Reason:" + eb.getMessage() + "}");
} finally {
// System.out.println("Finally not called if timeout occurs");
if (toClient != null) {
toClient.close();
}
if (fromClient != null) {
try {
fromClient.close();
} catch (IOException ex) {
Logger.getLogger(tcp_server.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
server.close();
} catch (IOException ex) {
Logger.getLogger(tcp_server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public static void main(String[] args) throws IOException {
int serverPort = 40820;
ServerSocket serverSocket = new ServerSocket(serverPort);
synchronized (serverSocket) {
for (;;) {
Socket server = serverSocket.accept();
new Thread(new tcp_server(server)).start();
}
}
}
}
这是更好的代码。。。但是仍然有相同的错误“连接重置”,尽管应用了60秒的超时,当然,您可以通过关闭连接来处理它
真正的问题是你为什么得到它?有几个常见的原因:
- 您向已被对等方关闭的连接进行了写入
- 您在未读取已到达套接字接收缓冲区的数据的情况下关闭了连接。这将重置对等点
这两个都是应用程序协议错误,应该修复。发送不被读取的数据没有任何意义。确切的例外情况是什么?(它是从哪一行代码中抛出的?)我记得有类似的东西,对此我无能为力。基本上,如果一个客户端在服务器发送所有数据之前断开连接(想象有人在web浏览器中的请求或其他操作进行到一半时按下“stop”(停止)),这会被抛出,如果我没有记错的话,我不确定您是否可以做些什么来捕捉它错误在“while”(line=fromClient.readLine())!=null){”从以上两点中,我只发现第1点是有效的。但是,如果我向一个已经关闭的连接写入数据,在太多这样的情况下,它不会给我“太多打开的文件错误”吗在不久的将来?@Bhavesh这些都没有意义。它们都是有效的。它们可能都不适用于您当前的情况,但这与“有效性”不同。如果您按照此处的建议关闭失败的连接,则关闭连接的对等方对本地端的文件描述符耗尽没有任何影响。