2009-07-22 6 views
3

Il me semble qu'il y a une sorte de limitation dans la création de socket dans MIDP. J'ai besoin de faire beaucoup de connexions à un serveur (pas de concourrent) et dans le quatrième ou le cinquième, mon ordinateur tombe en panne. Il se bloque dans le simulateur et dans mon vrai appareil aussi.Socles limités à midp?

Pour isoler toute possibilité d'être influencé par mon code, j'isolé le code suivant:

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(); 
    } 

Ce code se bloque dans le 13e essai.

J'ai essayé d'ajouter un sommeil de 10 secondes à l'intérieur d'une boucle while, et il se bloque au 13ème essai aussi.

Le message crash est:

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 

Répondre

7

Alors que c.close() dans le essai devrait être suffisant, je me demande si vous avez d'autres questions qui déclenchent ce. Le code devrait vraiment fermer la connexion ET inputtream à l'intérieur d'un finalement. Quelque chose comme ceci:

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

La raison, pourquoi le c.close() n'a pas vraiment été proche parce que le InputStream n'a pas été fermé. Certains périphériques requièrent que le flux et la connexion soient fermés. De plus, les connexions ne se ferment pas immédiatement sur certains périphériques lorsque la méthode close() est appelée. Vous pourriez avoir à faire un gc aussi

Questions connexes