Java HttpURLConnection, как получить несколько ответов от сервера - PullRequest
0 голосов
/ 01 ноября 2010

Я пытаюсь подключиться к серверу с сообщением 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 ]

2 голосов
/ 07 мая 2015

Немного стар, но я решил исправить здесь некоторую вопиющую дезинформацию.

Ответы о том, что множественные ответы на запрос HTTP не соответствуют спецификации HTTP, неверны!

С RFC 2616 :

10 Определения кодов состояния

Каждый код состояния описан ниже, включая описание того, каким методам он может следовать, и любую метаинформацию, требуемую в ответе.

10.1 Информационный 1xx

Этот класс кода состояния указывает предварительный ответ, состоящий из только строки состояния и необязательных заголовков, и завершается пустая строка Для этого класса статуса нет обязательных заголовков код. Поскольку HTTP / 1.0 не определял коды состояния 1xx, серверы ДОЛЖНЫ НЕ отправлять ответ 1xx клиенту HTTP / 1.0, кроме как в условия эксперимента.

Клиент ДОЛЖЕН быть готов принять один или несколько ответов статуса 1xx до регулярного ответа, даже если клиент не ожидает 100 (Продолжить) сообщение о статусе. Неожиданные ответы статуса 1xx МОГУТ быть игнорируется пользовательским агентом.

1 голос
/ 02 ноября 2010

То, что вы описали, это не HTTP, это нечто другое.Возможно, вы сможете заставить свой сервер реализовать это, а может и нет.Но вы ожидаете, что HttpURLConnection поймет что-то, что нарушает протокол HTTP, - это много, не правда ли?

...