我需要一段时间的设备运行你的代码,并用e.printStack();
填充所有的try-catch块来查看是否有一些例外被忽略,但没有运气,我不能得到相同的IOException
,它已经运行超过1小时,没有例外。
我有一个疑问,可能会做一些帮助,这是我无法找到任何代码来算FileDescriptor
,也许你没有上传代码的正确版本,或者,你记错号码在log 05-18 05:18:50.409: V/SocketCmdServer(636): Incoming client fd:FileDescriptor[35]
为计数为FileDescriptor
,我读到toString()
的源代码FileDescriptor
,这个数字不是一个计数器而是一个fd类型。
/**
* The Unix file descriptor backing this FileDescriptor.
* A value of -1 indicates that this FileDescriptor is invalid.
*/
private int descriptor = -1;
@Override public String toString() {
return "FileDescriptor[" + descriptor + "]";
}
在Linux上运行的任何Java虚拟机可以有最大插口引黄号码,怎么一回事,因为Linux的取套接字连接为一个文件,你可以看到通过这些Linux的CMDS的最大数量:
cat /proc/sys/fs/file-max
(PS :您可能需要一个busybox才能在android中获得完整的linux cmds)
并且不建议修改最大文件数。
高于一切,我已经建议如下:
1)尽量避免通过接触系统
2设置套接字连接的最大数量限制)填写大家try-catch块打印的轨道堆栈,以看看你是否成功地关闭了插座
private void connectToServer() {
LocalSocket client = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
client = new LocalSocket();
Log.v(TAG, "connectToServer # Connect to the server");
client.connect(new LocalSocketAddress(SOCKER_SERVER_NAME));
Log.v(TAG, "connectToServer # Send the command");
oos = new ObjectOutputStream(client.getOutputStream());
oos.writeObject(new String("Hello"));
oos.flush();
ois = new ObjectInputStream(client.getInputStream());
Object obj = ois.readObject();
Log.v(TAG, "connectToServer # Response is received");
}
catch (Exception e) {
Log.e(TAG, "connectToServer # Error:..", e);
}
finally {
// each close() method should be wrapped in seperated try-catch block
// or 1 or 2 close() method will be skipped
try {
if (oos != null) {
oos.close();
oos = null;
}
if (ois != null) {
ois.close();
ois = null;
}
if(client != null) {
client.close();
client = null;
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
阅读你建议的1024个主题1024个同时连接。你怪本地服务器,也许你必须责怪FileDescriptor。你需要什么描述符?在服务器中只有一个closeClient()调用永远不会被调用。由于服务器在收到并返回一条消息后不处理客户端,因此可以让服务器关闭客户端。在oos.flush()之后的try块中放置closeClient()。也许这会关闭文件描述符。 – greenapps
我有一台服务器。一个或多个客户端可以连接到该服务器。客户端将连接发送一些数据并断开连接。如果这发生超过1024次,则抛出java.io.IOException:套接字失败:EMFILE(太多打开的文件) – kakopappa
是的,我明白,因为你可以阅读我的评论。但是,您是否实施了我的建议并尝试了?请对建议做出反应。 – greenapps