我正在创建一些客户端套接字软件来从服务器读取事件。 (例如,流股股票行情)。Android套接字输入流读取(后面是EPIPE)
问题: .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上进行套接字编程?
谢谢。似乎我错过了-1表示该流已关闭。当我收到-1时我会推倒。如果我做了socket.setSoTimeout(xx),那么如果超时被击中,我应该接收0个字节,对吧? –
@MichaelSmyers错了。你为什么不阅读Javadoc,而不是所有这些不断猜测?在上述条件下,read()只会返回零,你会在Javadoc中找到它。如果你读取超时,你会得到一个SocketTimeoutException。 – EJP
感谢您的意见。我很感激帮助。 –