sockets - Android InputStream

标签 sockets inputstream

我正在学习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/

相关文章:

java - 无法从目录读取文件

java - 我应该把这个参数放在哪里以及如何运行这个程序?

c# - C#(ASP.NET)通过套接字与Android通信

c - 在 C 中使用相同的 fds 与 select 进行读/写

java - 从Web服务响应中读取InputStream

java - 读取站点源: � characters

java - 如何创建从数据库获取并保存文件夹的图片的路径?

python - python套接字程序: Cannot assign requested address

node.js - vue-socket.io 应用程序未收到来自 express socket.io 应用程序的发射

java - 如何在java中使用System.in.read()?