Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理socket程序中的连接重置错误_Java_Sockets_Error Handling - Fatal编程技术网

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这些都没有意义。它们都是有效的。它们可能都不适用于您当前的情况,但这与“有效性”不同。如果您按照此处的建议关闭失败的连接,则关闭连接的对等方对本地端的文件描述符耗尽没有任何影响。