Java - DocumentBuilder закрытие сокет соединения - PullRequest
1 голос
/ 28 апреля 2009

У меня проблема с слишком быстрым закрытием соединения Socket. Мне сказали, что мне нужно временно загрузить данные из Socket и проанализировать их. Вот мой код:

ServerSocket listen = new ServerSocket(this.port);
Socket server;

while(i < this.maxConnections)
{
    server = listen.accept();
    processRequest(server);
    i++;
}

ProcessRequest

protected void processRequest(Socket server) throws IOException
{
    ProcessXML response = new ProcessXML(server.getInputStream());

    new PrintWriter(server.getOutputStream(), true).println("response text");
}

processXML

public ProcessXML(InputStream is)
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    factory.setNamespaceAware(false);

    Document doc = factory.newDocumentBuilder().parse(new InputSource(is));
    ....
}

ошибка

[Fatal Error] :2:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at ProcessXML.<init>(ProcessXML.java:22)
at Bank.processRequest(Bank.java:41)
at Bank.listen(Bank.java:25)
at BankStart.main(BankStart.java:6)

Теперь я могу сохранить содержимое server.GetInputStream() в файл и затем передать его в DocumentBuilder, но я думаю, что это плохое решение. Как я могу хранить контент во временном хранилище, а также иметь возможность передавать его в .parse(), не закрывая сокет?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2009

Я думаю, что решение, которое вы используете, ожидает, что данные будут доступны во время создания. Вам нужно будет использовать анализатор потока. найдите реализацию STAX, и вы сможете это сделать

0 голосов
/ 24 февраля 2014

Напишите себе производный класс FilterInputStream, который игнорирует close(), и оберните входной поток сокета в него перед его передачей в DocumentBuilder.parse().

0 голосов
/ 28 апреля 2009

Не похоже на сокетную вещь ... В противном случае вы увидите исключение закрытого сокета или что-то в этом роде. В качестве теста просто прочитайте байты и сохраните его где-нибудь в текстовом файле, пока не беспокойтесь о создании документа. Убедитесь, что файл представляет собой правильно сформированный XML и что кодировка соответствует указанной в документе. Ищите в конце файла любые забавные символы, возможно, клиент вставляет какой-то странный символ EOF или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...