我正在学习android,但无法超越InputStream.read()。
这只是一个套接字测试-服务器在收到连接时会发回两个字节,我知道这可以正常工作。我要做的就是读取这些值。 b = data.read依次读取两个值,然后挂起,它从不返回预期的-1值。同样,它不会引发异常。
有任何想法吗?
谢谢。
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
try {
Log.d("Socket", "try connect ");
Socket sock = new Socket("192.168.0.12", 5001);
Log.d("socket", "connected");
InputStream data = sock.getInputStream();
int b = 0;
while (b != -1) {
b = data.read();
}
data.close();
} catch (Exception e) {
Log.d("Socket", e.toString());
}
}
};
t.start();
}
最佳答案
到达流的末尾是一种特殊的状态。这不会仅仅因为没有什么可阅读的东西而发生。如果流仍处于打开状态,但没有任何内容可供读取,请使用it will "hang" (or block) as you've noticed,直到遇到一个字节为止。
要执行您想要的操作,服务器要么需要关闭/结束流,要么需要使用:
while (data.available() > 0) {
..
当可用字节数为零时,流缓冲区中没有任何要读取的内容。
另一方面,如果您知道应该只读取两个字节,而这就是数据的结尾,那么只需读取两个字节并继续操作即可(即,不要使用
while
循环)。在此处使用while
循环的原因仅是在您不确定要预期的总字节数的情况下。
关于sockets - Android InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7783799/