先说一下程序的流程:
写SocketServer端的接收程序,接收Client端的请求后创建文件,并将接收到的数据流写在新创建的文件里,最后关闭数据流和Socket。如此多线程执行500次。
问题是这样的:
当Client端发送请求并发送数据,这样Server端接收请求后本地创建文件,并将接收到的数据写到文件中,程序运行正常。
当Client端发送请求但不发送数据,也就是Server端接收请求后,只创建本地空文件,并没有写数据,就会报这样的错误:java.io.FileNotFoundException: test/fileThread-494 (Too many open files)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
        at OutputThread.run(SimpleServer.java:52)
Exception in thread "main" java.io.FileNotFoundException: test/fileThread-495 (Too many open files)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
        at OutputThread.run(SimpleServer.java:52)
Exception in thread "Thread-494" java.lang.NullPointerException
        at OutputThread.run(SimpleServer.java:60)
java.net.SocketException: Too many open files
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
        at java.net.ServerSocket.implAccept(ServerSocket.java:453)
        at java.net.ServerSocket.accept(ServerSocket.java:421)
        at SimpleServer.main(SimpleServer.java:26)每次写文件后都会关闭文件流和socket。
问题应该定位在Linux系统的打开最大文件数,这个不是我要问的问题。
程序是并发执行的,不解的是Server端创建文件后并写数据,再关闭文件,这样的流程不会报上面的错误,然而,Server端创建空文件,再关闭文件,这样就会报上面的错误。
后者的情况是创建空文件并马上关闭,应该不会达到系统最大文件数啊,至少比前一种情况处于打开状态的文件数少啊,为什么前一种情况没有出错,后一种情况会出现错误呢。说的有些乱,不知道能不能让大家理解我的意思,希望朋友们帮忙看一下。