2009-07-22 3 views
3

Мне кажется, что существует какое-то ограничение в создании сокетов в MIDP. Мне нужно сделать много подключений к серверу (ни один concourrent), а в четвертой или сильной попытке мое приложение выйдет из строя. Он падает в симуляторе и в моем реальном устройстве.Ограниченные розетки для midp?

Чтобы выделить какую-либо возможность его под влиянием моего кода, я выделил следующий код:

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

Этот код происходит сбой в 13 раза.

Я попытался добавить спать в течение 10 секунд внутри цикла while, и он падает на 13-й попытке тоже.

Сообщения краха:

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 

ответ

7

Хотя c.close() внутри попытки должен быть адекватным, мне интересно, если у вас есть другие вопросы, которые инициирующие это. Кодекс действительно должен закрывать соединение AND inputstream внутри finally. Что-то вроде этого:

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

Причина, почему c.close() фактически не было близко, потому что InputStream не был закрыт. Некоторые устройства требуют, чтобы и поток, и соединение были закрыты. Также соединения сразу не закрываются, на некоторых устройствах, когда вызывается метод close(). Возможно, вам придется сделать gc слишком