Meine Frage ist: gibt es eine Möglichkeit, einen Socket OutputStream Shutdown durchführen oder es ist nicht richtig/voll implementiert, wie es von Nokia sein sollte? (J2ME nokia-Implementierung, getestet auf nokia c6-00 und nicht schließen Stream, getestet auf Emulator und funktioniert gut)
Das Hauptproblem besteht darin, dass die J2SE-Serveranwendung die Information über das Ende des Streams nicht erhält, die Bedingung read(buffer) == -1 ist nie wahr, sie versucht, von einem leeren Stream zu lesen und bleibt hängen, bis der Client zwangsbeendet wird. Dies funktioniert mit einem sehr, sehr, sehr hässlichen Workaround auf der Serveranwendung
Thread.sleep(10);//wait some time for data else you would get stuck........
while ((count = dataInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, count);
if (count != BUFFER_SIZE_1024 || dataInputStream.available() == 0) { //the worlds worst condition ever written... but works
break;
}
Thread.sleep(10);//wait for data input to get some data for dataInputStream.available() to return != 0 if client still sends data else you would not read all data......
}
aber diese Lösung ist absolut nicht akzeptabel (ich weiß nicht, etwas über Nokia-Java-Codierung, ich vermisse etwas, oder ist es vielleicht ähnlich wie eine Art von Nokia-J2ME-Codierungsstandard und ich sollte sich daran gewöhnen oder Plattform ändern)
Ich kann den Client-Socket nach dem Senden von Daten nicht schließen, da der Server nach dem Empfang und der Verarbeitung der Daten eine Antwort an den Client sendet.
Das sieht folgendermaßen aus: J2ME-Client -> J2SE-Server (hängt sich beim Lesen auf, weil der Client keinen Outputstream-Shutdown durchführt) -> J2ME
Ich habe es versucht: den dataOutputStream auf dem J2ME-Client zu schließen - keine Wirkung setSocketOptions (KEEPALIVE, SNDBUF und andere) - keine Wirkung oder Fehler
Auf dem Zielgerät scheint nichts zu funktionieren.
Tut mir leid, aber ich bin gerade ein bisschen wütend nach diesem unsinnigen Streit mit Little Java.
Ich habe nach einer Lösung gesucht, aber sie scheint nicht zu funktionieren.
Client-Code:
SocketConnection socketConnection = (SocketConnection) Connector.open("socket://" + ip + ":" + port);
int count;
byte[] buffer = new byte[BUFFER_SIZE_1024];
// client -> server
DataOutputStream dataOutputStream = new DataOutputStream(socketConnection.openDataOutputStream());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
while ((count = byteArrayInputStream.read(buffer)) != -1) {
dataOutputStream.write(buffer, 0, count);
dataOutputStream.flush();
}
dataOutputStream.close();
byteArrayInputStream.close();