【发布时间】:2014-06-26 21:52:06
【问题描述】:
我的应用程序非常简单。客户端将连接到 LocalServerSocket(Unix 域套接字)并发送一些数据并断开连接。如果此过程重复超过 1024 次,则服务器在接受新客户端时会抛出 java.io.IOException: socket failed: EMFILE (Too many open files)。
我在这里上传了我的演示代码 http://speedy.sh/NBSjr/SocketIssue.zip
您可以在代码中看到客户端在与服务器建立另一个连接之前关闭了已建立的连接。在 logcat 中,您可以看到服务器中的 FileDescriptor 计数正在增加,并且当客户端在第 1023 次连接时崩溃。
我该如何解决这个问题?请指教
我在运行 Android 4.3 的三星 S4 上进行了尝试。它似乎在重用文件描述符,我的演示应用程序可以运行几个小时!
于 2014 年 5 月 19 日更新
如果您没有运行 Android 4.4.2 的设备,您可以在运行 Android 4.4.2 的模拟器上尝试此代码
【问题讨论】:
-
阅读主题你建议1024个同时连接。你责怪 LocalServer,也许你不得不责怪 FileDescriptor。你需要那个描述符做什么?您在服务器中只有一个 closeClient() 调用,永远不会被调用。由于服务器在收到并返回一条消息后不处理客户端,因此您也可以让服务器关闭客户端。将 closeClient() 放在 oos.flush() 之后的 try 块中。也许这会关闭文件描述符。
-
我有一台服务器。一个或多个客户端可以连接到该服务器。客户端将连接发送一些数据并断开连接。如果这种情况发生超过 1024 次,则抛出 java.io.IOException: socket failed: EMFILE (Too many open files)
-
是的,我明白这一点,正如您在我的评论中看到的那样。但是您是否实施了我的建议并尝试过?请对建议做出反应。
-
感谢您的建议。我在 oos.flush() 之后移动了代码。没用