3

在我看来,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 次尝试中崩溃。

我尝试在 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() 应该足够了,但我想知道您是否还有其他触发此问题的问题。代码确实应该在 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!"); 
    }
  }
}
于 2009-07-22T19:49:49.883 回答
0

c.close() 实际上没有关闭的原因是输入流没有关闭。某些设备要求关闭流和连接。此外,在某些设备上,当调用 close() 方法时,连接不会立即关闭。你可能也需要做一个 gc

于 2009-08-03T06:02:17.190 回答