ich eine Weile dauern, um deinen Code zu starten und alle try-catch-Blöcke mit e.printStack();
zu füllen, um zu sehen, ob einige Ausnahmen ignoriert werden, aber kein Glück, kann ich nicht IOException
bekommen, es hat mehr als 1 Stunde ohne Ausnahme gelaufen.
ich eine Frage haben, die etwas Hilfe tun kann, also ich keinen Code FileDescriptor
zählen finden, vielleicht haben Sie nicht die richtige Version des Codes laden oder verwechselte Sie die Nummer in log 05-18 05:18:50.409: V/SocketCmdServer(636): Incoming client fd:FileDescriptor[35]
für die Anzahl von FileDescriptor
, ich lese den Quellcode toString()
von FileDescriptor
, die Nummer ist kein Zähler, sondern ein Fd-Typ.
/**
* 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 + "]";
}
jeder Java-VMs auf Linux laufen kann die max Buchse Connetion-Nummern haben, beacuse Linux-take-Socket-Verbindung als eine Datei, können Sie die maximale Anzahl über diese Linux cmds sehen:
cat /proc/sys/fs/file-max
(PS : möglicherweise benötigen Sie eine busybox, um volle linux cmds in android zu erhalten)
und es wird nicht empfohlen, die maximale Dateinummer zu ändern.
vor allem, ich habe Vorschläge, wie unten:
1) versuchen, die maximale Anzahl Grenze von Socket-Verbindungen durch das System gesetzt zu vermeiden erreichen
2) füllen alle von Ihnen try-catch-Block der Spur zu drucken Stacks zu sehen Sie, ob Sie den Sockel erfolgreich schließen
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();
}
}
}
Lesen Sie das Thema Sie 1024 simultan Verbindungen vorschlagen. Sie geben LocalServer die Schuld, wo Sie vielleicht FileDescriptor verantwortlich machen müssen. Wozu brauchst du diesen Deskriptor? Sie haben nur einen Aufruf von closeClient() auf dem Server, der niemals aufgerufen wird. Da der Server einen Client nicht behandelt, nachdem eine Nachricht empfangen und zurückgegeben wurde, können Sie den Server auch den Client schließen lassen. Setzen Sie im try-Block nach oos.flush() den Befehl closeClient(). Vielleicht schließt das den Dateideskriptor. – greenapps
Ich habe einen Server. Ein oder mehrere Clients können sich mit diesem Server verbinden. Ein Client verbindet einige Daten und trennt die Verbindung. Wenn dies mehr als 1024 mal passiert, löst es java.io aus.IOException: socket failed: EMFILE (Zu viele offene Dateien) – kakopappa
Ja, ich habe das verstanden, wie Sie in meinem Kommentar lesen können. Aber hast du meinen Vorschlag umgesetzt und es versucht? Bitte reagieren Sie auf Vorschläge. – greenapps