2009-07-22 7 views
3

Es scheint mir, dass es eine Art Einschränkung in der Socket-Erstellung in MIDP gibt. Ich muss viele Verbindungen zu einem Server (kein Concurrent) machen und im vierten oder fünften Versuch stürzt meine App ab. Es stürzt im Simulator und auch in meinem realen Gerät ab.Begrenzte Sockets zu Midp?

jede Möglichkeit zu isolieren davon durch meinen Code beeinflusst wird, isoliert ich den folgenden Code:

try { 
     StreamConnection c; 
     StringBuffer sb = new StringBuffer(); 
     c = (StreamConnection) Connector.open(
      "http://www.cnn.com.br/", Connector.READ_WRITE); 
     InputStreamReader r = new InputStreamReader(c.openInputStream(), "UTF-8"); 
     System.out.println(r.read()); 
     c.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

Dieser Code im 13. Versuch abstürzt.

Ich habe versucht, einen Schlaf von 10 Sekunden innerhalb einer While-Schleife hinzuzufügen, und es stürzt beim 13. Versuch auch ab.

Die Crash-Nachricht ist:

java.io.IOException: Resource limit exceeded for TCP client sockets 
- com.sun.midp.io.j2me.socket.Protocol.open0(), bci=0 
- com.sun.midp.io.j2me.socket.Protocol.connect(), bci=124 
- com.sun.midp.io.j2me.socket.Protocol.open(), bci=125 

Antwort

7

Während c.close() innerhalb des try ausreichend sein sollte, frage ich mich, wenn Sie andere Probleme, die diese auslösen. Der Code sollte wirklich schließen Sie die Verbindung und Inputstream innerhalb eines schließlich. Etwas wie das:

StreamConnection c = null; 
InputStream is = null; 
try { 
    StringBuffer sb = new StringBuffer(); 
    c = (StreamConnection) Connector.open(
     "http://www.cnn.com.br/", Connector.READ_WRITE); 
    is = c.openInputStream(); 
    InputStreamReader r = new InputStreamReader(is, "UTF-8"); 
    System.out.println(r.read()); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} finally { 
    if (is != null) { 
    try { 
     is.close(); 
    } catch (Exception ex) { 
     System.out.println("Failed to close is!"); 
    } 
    } 
    if (c != null) { 
    try { 
     c.close(); 
    } catch (Exception ex) { 
     System.out.println("Failed to close conn!"); 
    } 
    } 
} 
0

Der Grund, warum die c.close() nicht wirklich geschlossen wurde, war, weil der Eingangsstrom nicht geschlossen wurde. Bei einigen Geräten müssen sowohl der Stream als auch die Verbindung geschlossen sein. Außerdem werden die Verbindungen bei einigen Geräten nicht sofort geschlossen, wenn die Methode close() aufgerufen wird. Möglicherweise müssen Sie auch eine GC

tun