0

我正在尝试使用 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;
}
4

2 回答 2

3

有点老了,但我决定在这里纠正一些公然的错误信息。

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

来自RFC 2616

10 状态码定义

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

10.1 信息 1xx

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

客户端必须准备好在常规响应之前接受一个或多个 1xx 状态响应,即使客户端不期望收到 100(继续)状态消息。用户代理可能会忽略意外的 1xx 状态响应。

于 2015-05-07T09:39:42.150 回答
1

你所描述的不是 HTTP,它是别的东西。您可能可以让您的服务器实现它,但您可能不会。但是希望 HttpURLConnection 能够理解违反 HTTP 协议的内容,这要求有点高,你不觉得吗?

于 2010-11-02T08:43:47.853 回答