我正在创建一些客户端套接字软件来从服务器读取事件。 (例如,流媒体股票报价)。
问题: .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 上进行套接字编程的正确方法?
最佳答案
我使用下面的代码没有问题:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
myLineProcess(line); //here you process you line result
}
祝你好运。
关于java - Android 套接字输入流读取(后跟 EPIPE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592707/