Необработанный XML Push из входного потока захватывает только первую строку XML - PullRequest
0 голосов
/ 17 декабря 2010

Я пытаюсь прочитать XML, который отправляется в мое Java-приложение.У меня изначально было это на моем сервере Glassfish работает.Рабочий код Glassfish выглядит следующим образом:

public class XMLPush implements Serializable
{    
public void processXML()
{
    StringBuilder sb = new StringBuilder();
    BufferedReader br = null;
    try
    {
        br = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getReader ();
        String s = null;
        while((s = br.readLine ()) != null)
        {
            sb.append ( s );
        }
          //other code to process xml
        ...........
.............................

    }catch(Exception ex)
    {
        XMLCreator.exceptionOutput ( "processXML","Exception",ex);
    }
....
.....
}//processXML
}//class

Он отлично работает, но мой клиент не может установить Glassfish на своем сервере.Я пытался получить сырой XML из php, но я не мог заставить его работать.Я решил открыть сокет и прослушать толчок xml вручную.Вот мой код для получения push:

public class ListenerService extends Thread
{
private BufferedReader reader = null;
private String line;
public ListenerService ( Socket connection  )thows Exception
{
        this.reader = new BufferedReader ( new InputStreamReader ( connection.getInputStream () ) );
        this.line = null;

}//ListenerService
@Override
public void run ()
{
    try
    {
        while ( (this.line = this.reader.readLine ()) != null)
        {
            System.out.println ( this.line );
                 ........

        }//while
    }      System.out.println ( ex.toString () );
        }
    } catch ( Exception ex )
    {
        ...
    }//catch
}//run

Я не много занимался программированием сокетов, но из того, что я прочитал за последнюю неделю, является то, что передача xml в строку - это плохо.Что я делаю неправильно, и почему на сервере Glassfish это работает, а когда я просто открываю сокет, это не так?

Это все, что я получаю от push:

PUT /?XML_EXPORT_REASON=ResponseLoop&TIMESTAMP=1292559547 HTTP/1.1
Host: ************************
Accept: */*
Content-Length: 470346
Expect: 100-continue

<?xml version="1.0" encoding="UTF-8" ?>

Куда делся xml?Это потому, что я помещаю это в строку?Мне просто нужно взять XML и сохранить его в файл, а затем обработать его.Все остальное работает, но это. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2010

Первая строка XML содержала терминатор строки (\ r \ n), а остальная часть XML - нет. Это причина, почему мои темы застряли. Я использовал

BufferedReader reader;
int i;
while((i = reader.read()) != -1)

и преобразовал его в char:

StringBuilder sb = new StringBuilder();
sb.append((char)i);

и вставил все данные в созданный мною xml-файл и смог все сделать правильно.

Единственное, у меня была похожая проблема в конце, поэтому я должен был проверить, достиг ли я конца XML-документа. Я просто поместил последние 9 символов потока в массив и проверил его по последней части того, чем должен заканчиваться XML-файл. Теперь работает нормально, и клиент (и я тоже) очень доволен. :) Надеюсь, это поможет.

О, последнее замечание. Я читал, что JDOM может непосредственно использовать поток ввода. Я еще не проверял это, но это было бы более эффективно использовать, если завершение линии также не будет проблемой. Может быть, кто-то еще использовал JDOM с inputtream и имел проблему с завершением строки?

0 голосов
/ 21 декабря 2010

Я думаю, что ключ здесь - эта строка в вашем push-запросе:

100-continue

Из спецификации HTTP / 1.1:

Цель статуса 100 (Продолжить) (см. Раздел 10.1.1) состоит в том, чтобы позволить клиенту, отправляющему сообщение запроса с телом запроса, определить, желает ли исходный сервер принять запрос (на основе заголовки запроса) до того, как клиент отправит тело запроса. В некоторых случаях отправка тела может быть неуместной или крайне неэффективной, если сервер отклонит сообщение, не глядя на тело.

Когда вы проходите через GlassFish (или какую-либо другую технологию, реализующую стандарты HTTP), это промежуточное программное обеспечение будет обрабатывать все переговоры, чтобы гарантировать, что к тому времени, когда запрос попадет в ваш код, у вас будет все, что вы сможете принять. Поскольку в вашем примере вы читаете напрямую из Socket, у вас ничего нет между вами и клиентом, обрабатывающим HTTP-переговоры, поэтому вы получаете только первый бит и «100-продолжение», ожидая продолжения.

...