init错误:java.net.SocketException:打开的文件太多



我正在学习java.net,并创建了一个传输文件的简单应用程序。我从磁盘上取文件,将它们转换为byte[],几分钟后出现问题,它会删除以下内容:

init error: java.net.SocketException: Too many open files
java.lang.NullPointerException

每次尝试发送文件时。

代码:

    public class Main extends Thread {
        public static final FilesGetter filesGetter = new FilesGetter();
        public static Socket s;
        public static File[] files;
        public static void main(String args[]) throws Exception{
            s = new Socket("localhost", 3128);
            while (true){
                try{
                    files = filesGetter.getFilesList("/etc/dlp/templates/");
                    Socket s = new Socket("localhost", 3128);
                    args[0] = args[0]+"n"+s.getInetAddress().getHostAddress()
                            +":"+s.getLocalPort();
                    if (files != null){
                        for (int i = 0; i < files.length; i++){
                            InputStream is = new FileInputStream(files[i]);
                            byte[] message = IOUtils.toByteArray(is);
                            s.getOutputStream().write(message);
                            byte buf[] = new byte[128*1024];
                            int r = s.getInputStream().read(buf);
                            String data = new String(buf, 0, r);
                            System.out.println(data);
                        }
                    }
                } catch(Exception e){
                    System.out.println("init error: "+e);
                }
            }       
}

如何解决这个问题?

您有一个循环,在每个迭代中打开一个新的套接字。你似乎从来没有关上任何插座。当作用域外的对象被GC’ed时,它们可能会被关闭,但您正在以非常高的速率创建这些套接字,并耗尽可用的文件句柄。

完成后关闭每个套接字。

最新更新