【问题标题】:InputStream receives incomplete dataInputStream 接收到不完整的数据
【发布时间】:2013-07-25 01:39:31
【问题描述】:

我正在使用 Socket 连接来连接数据库。当我通过 InputStream 从数据库中提取数据时,有时它会返回完整的数据,但大多数时候它会返回不完整的数据 (5%/95%)。数据库发送了一个 EOF,但它只有大约 5% 的时间。

    @Override
    protected Socket doInBackground(Void... params) {


        Socket client = null;
        try {
            client = new Socket(SocketHelper.IP_ADDRESS, SocketHelper.PORT);

            //output message
            OutputStream output = client.getOutputStream();
            output.write(message.getBytes("UTF-8"));


            //parse response 
    //blocks here more of the time
            SocketHelper.parseData(client.getInputStream());


        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return client;
    }

在我的 parse 方法中,我查找 EOF,通常会关闭 InputStream 并在那里关闭 Socket。我找不到它到达 EOF 的时间的任何一致性。现在数据的长度是静态的,我在试图弄清楚这一点时没有调整它。但是数据的长度将是动态的。

【问题讨论】:

  • SocketHelper.parseData 是做什么的?
  • 确实如此。如果没有这些知识,您的问题将无法回答。
  • SockerHelper.parseData 使用从 client.getInputStream() 返回的 InputStream 创建一个 BufferedReader; while((line = reader.readLine()) != null) ....

标签: android sockets inputstream


【解决方案1】:

要从Socket 读取数据,您需要在parseData 方法中循环调用read(byte[] b, int off, int len),直到您期望的所有字节都到达。

read 方法返回实际读取的字节数;继续循环,直到你得到一切。请记住调整 offset 参数,以便构建完整的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多