我正在创建一些客户端套接字软件来从服务器读取事件。(例如,流式股票报价)。
问题: .read(b); 立即返回值为-1。这会导致无限循环并且手机变得非常热。此外,对 s.isConnected()、isOpen()、isBound() 的所有检查都返回 true。基本上套接字看起来已连接。(这是一个错误场景,因此 .setSoTimeout(x) 的任何值都无效。12 分钟,或者留空。.read(b) 总是立即返回 -1)。
当我稍后通过 getOutputStream() 写入它时,我收到一个异常 EPIPE(管道损坏)。
这是核心代码(为简洁起见,省略了日志语句/值检查)。
s.connect(new InetSocketAddress(host, port), CONNECT_TIMEOUT_MILLIS);
byte[] b = new byte[1024];
while (s.isConnected()) {
int bytesToRead = s.getInputStream().read(b);
if (bytesToRead <= 0) {
LOGGER.debug("no bytes read? trying again.");
continue;
}
processFrame(b);
}
如果我在手机上循环 3g,它工作正常。有时它会进入这种奇怪的状态。
问题
难道我做错了什么?这是预期的行为吗?我可以查看现有代码来展示在 Android 上进行套接字编程的正确方法吗?