3

MIDPでのソケット作成には、ある種の制限があるように思われます。サーバーに多くの接続を確立する必要があり(一致しません)、4回目または5回目にアプリがクラッシュします。シミュレーターと私の実際のデバイスでもクラッシュします。

コードの影響を受ける可能性を分離するために、次のコードを分離しました。

    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回目の試行でクラッシュします。

whileループ内に10秒間のスリープを追加しようとしましたが、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
4

2 に答える 2

7

try 内の c.close() で十分ですが、これを引き起こしている他の問題があるかどうか疑問に思っています。コードは実際には、最終的に接続と入力ストリームを閉じる必要があります。このようなもの:

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!"); 
    }
  }
}
于 2009-07-22T19:49:49.883 に答える
0

c.close() が実際に閉じなかった理由は、入力ストリームが閉じられていなかったためです。一部のデバイスでは、ストリームと接続の両方を閉じる必要があります。また、一部のデバイスでは、close() メソッドが呼び出されたときに接続がすぐに閉じられません。あなたもgcをしなければならないかもしれません

于 2009-08-03T06:02:17.190 に答える