Java HttpURLConnection如何从服务器接收多个响应

时间:2010-11-01 05:30:25

标签: java http httpurlconnection

我正在尝试使用POST消息连接到服务器,要求服务器订阅我。然后,服务器将保持http连接打开并使用实时状态向我发回异步消息,直到我请求取消订阅或自行关闭连接。我无法从服务器读取这些后续响应。以下代码确实连接到服务器并成功读取第一个响应并将其打印到控制台。问题是在它之后无限地读取相同的响应(第一个响应)并将其打印到屏幕上。

有谁看到我搞砸了什么?我试图只是观察来自服务器的下一个异步消息并阻止它到来。此外,如果有人知道如何注册,以便在下一条消息异步显示时收到通知,这样我就不必阻止等待甚至更好。

public void HttpSubscription() 
{
    byte[] result = new byte[10240];

    try
    {
        /* Generate the hard coded request data */
        final StringBuffer soap = new StringBuffer();
        soap.append("<s:Envelope><s:Body><SoapTest1>thing1</SoapTest1></s:Body></s:Envelope>");

        // to make HTTP Post request with HttpURLConnection
        URL url = new URL("http://192.168.1.110:80/services");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();

        // then set some properties and make a request
        conn.setRequestMethod("POST");
        conn.setRequestProperty( "Content-type", "text/xml; charset=utf-8" );

        // Get a handle to the output stream 
        OutputStream OStream = conn.getOutputStream();

        // Write the soap data to the output stream
        OStream.write(soap.toString().getBytes());

        InputStream ResponseStream = conn.getInputStream();
        while (true)
        {
            int len = ResponseStream.read(result);
            String value = new String(result);
            System.out.println(value);
        }
    }
    catch (Exception e)
    {
        System.out.println(e);
    }

    return;
}

2 个答案:

答案 0 :(得分:2)

有点老了,但我决定纠正一些明显错误的信息。

答案表明HTTP请求的多个响应不符合HTTP规范是错误的!

来自RFC 2616

  

10个状态码定义

     

下面描述了每个状态代码,包括它可以遵循哪种方法以及响应中所需的任何元信息的描述。

     

10.1信息1xx

     

此类状态代码表示临时响应,包括   仅限于Status-Line和可选标头,并由a终止   空行。此类状态没有必需的标头   码。由于HTTP / 1.0没有定义任何1xx状态代码,服务器必须   不向HTTP / 1.0客户端发送1xx响应,但不包括   实验条件。

     

客户必须准备接受一个或多个1xx状态响应   在定期回复之前,即使客户不期望100   (继续)状态消息。意外的1xx状态响应可能是   被用户代理忽略。

答案 1 :(得分:1)

您所描述的不是HTTP,而是其他内容。您可能能够让服务器实现它,您可能不会。但是期望HttpURLConnection能够理解违反HTTP协议的内容,这有点问题,你不觉得吗?