java - 将 http 响应读入输入流时遇到问题

标签 java http blackberry

我从我的 Blackberry 应用程序调用 .Net Web 服务。在 KSoap2 遇到麻烦之后,我决定手动完成所有操作。这是一段代码:

byte [] postDataBytes = soapRequestEnvelope.getBytes();
byte [] dataRetrieved;

    try
    {
        HttpConnection connection = (HttpConnection)Connector.open(URL);

        connection.setRequestMethod(HttpConnection.POST);
        connection.setRequestProperty("soapaction", soapAction);
        connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

        os = connection.openOutputStream();
        os.write(postDataBytes);

        int rc = connection.getResponseCode();

        if(rc == HttpConnection.HTTP_OK)
        {
            inputStream = connection.openInputStream();
            dataRetrieved = new byte[(int)connection.getLength()];
            int bytesRead = inputStream .read(dataRetrieved);

        }
        else
        {

            dataRetrieved = null;

        }


        String dataString = new String(dataRetrieved);

//HttpConnection = javax.microedition.io.HttpConnection

//inputStream = java.io.InputStream

我遇到的问题是,我从 Web 服务调用返回的 XML 被缩短了。

当我将接收到的字节数打印到屏幕上时,有时会显示 1170(这实际上是我在这种特殊情况下期望的响应大小。)

但其他时候接收到的字节是702……为什么是702???

我连续测试了大约十几次,得到了以下结果:

1170, 702, 1170, 1170, 702, 1170, 1170, 702, 1170, 702, 1170, 702, 702, 702, 1170, 702

但是为什么是702?当它搞砸并且不起作用时,为什么它如此一致?虽然它总是分配 1170 字节,但为什么有时只读取 702?

这很奇怪。

编辑:我也尝试将 inputStream.available() 打印到屏幕上进行比较,完全不一致。它在 0、702 和 1170 之间变化。有时可用字节是 0 或 702,而读取的字节是 1170。我完全困惑了。

任何帮助将不胜感激。

谢谢

最佳答案

在我发表了一些模糊的评论之后,我想我应该具体说明“将 read 放入循环中”的含义。如defined ,read 将返回读取的字节数,如果到达文件末尾,则返回 -1

从套接字读取时,您可能会在所有数据从服务器返回给您之前调用 read()。这样做的实际效果是,您调用 read() 并且返回的数据比您预期的要少。这仅仅意味着您需要再次调用它(一次又一次),直到获得所有数据。

我建议使用一个简单的固定大小缓冲区并循环遍历read()直到得到-1并对每个 block 执行一些操作(将其写入文件,例如。)这可以防止您需要将整个文件存储在内存中。例如:

byte buf[1024];
int len;

while((len = read(buf)) >= 0)
{
    /* do something with len bytes of buf */
}

当然,您可以保证该文件会很小,并且您确实希望将整个文件都存储在内存中。在这种情况下,您可以(如上面所做的那样)只分配 connection.getLength() 大小的缓冲区,但是您需要调用 3-arg read(byte[] , int, int) 并做更多的整理工作:

int remain = (int) connection.getLength();
byte buf[remain];
int offset = 0, len;

while((len = read(buf, offset, remain)) >= 0)
{
    offset += len;
    remain -= len;
}

关于java - 将 http 响应读入输入流时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722549/

相关文章:

blackberry - BlackBerry SDK的 9-patch 库

java - AWS 无服务器请求 - JSON body/httpMethod 始终为 null

.htaccess - 使用 htaccess 将 https 重定向到 http 期望一个 url

blackberry - 尝试使用 Connector.open() 打开 TLS 连接时在 BlackBerry 上抛出 EOFException

android - 您使用 RhoMobile + JqueryMobile + KnockoutJS 的体验如何?

java - response.sendError(403),但返回是404

Java 显式引用转换

java - 为什么 "mvn verify"不运行我的集成测试?

java - Spring RequestMapping 正则表达式排除字符串

apache - 自定义 URI 方案的类似 HTTP 处理,可能吗?