【发布时间】:2010-07-08 19:50:25
【问题描述】:
我在黑莓 OS 5 上的网络 I/O 代码存在一些问题。
在我的 I/O 操作期间,我不断收到零星的挂起,并最终导致 TCP 超时异常。
我正在使用 5.0 网络 API 来建立每次都能完美运行的连接。
问题在于执行实际 I/O 时。我有一个后台工作线程,它为队列中的 I/O 请求提供服务。只有一个后台线程,所以所有请求都序列化到这个线程上。
完成通知是通过在请求排队时传入的委托接口完成的。
在后台工作线程上调用完成委托,但客户端可以通过invokeLater 将其重新发布到事件线程以进行 UI 更新等。
注意事项:
HttpRequest 是我自己的类,它保存有关请求的数据。
MutableData 是我自己的类,用于保存读取的数据。
BUFFER_SIZE = 2048
HttpConnection getConnectionForRequest(final HttpRequest inRequest) {
final String url = inRequest.getURL();
final int[] availableTransportTypes =
TransportInfo.getAvailableTransportTypes();
final ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setPreferredTransportTypes(availableTransportTypes);
connectionFactory.setConnectionMode(ConnectionFactory.ACCESS_READ);
final ConnectionDescriptor connectionDescriptor =
connectionFactory.getConnection(url);
HttpConnection connection = null;
if (connectionDescriptor != null) {
connection = (HttpConnection) connectionDescriptor.getConnection();
}
return connection;
}
public void run() {
while (isRunning()) {
// This blocks waiting on a request to appear in the queue.
final HttpRequest request = waitForRequest();
final HttpConnection connection = getConnectionForRequest(request);
final MutableData data = new MutableData();
final InputStream inputStream = connection.openInputStream();
final byte[] readBuffer = new byte[BUFFER_SIZE];
int chunkSize;
// *** The following read call sporadically hangs and eventually throws
// a TCP timeout exception.
while((chunkSize = inputStream.read(readBuffer, 0, BUFFER_SIZE)) != -1) {
data.appendData(readBuffer, 0, chunkSize);
}
mDelegate.receivedDataForRequest(request, data);
}
}
当它挂起时,它总是在大约 30 秒左右后最终引发 TCP 超时错误。 如果这种情况偶尔发生,我会把它归结为正常的网络拥塞,但它 频繁发生足以表明存在更深层次的问题。
编辑:
它发生在各种模拟器和我拥有的 2 个物理设备上。 我试过的模拟器是……
- 风暴9550
- 游览 9630
- 加粗9000
- 珍珠9100
- 曲线 8530
我有一个 Curve 8530 和 Storm 9550 设备,这两种设备都会发生这种情况。
任何帮助将不胜感激。
【问题讨论】:
-
这是模拟器还是真机?
-
添加了设备和模拟器信息。
-
我问的原因是因为我发现 5.0 模拟器在网络仿真方面存在相当大的问题 - 经常无缘无故地挂起连接。但是,由于您也在真实设备上看到它,所以它一定是不同的。
标签: java blackberry inputstream java-me