Java - DocumentBuilder关闭Socket连接

时间:2009-04-28 10:40:45

标签: java sockets connection

我遇到问题,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 个答案:

答案 0 :(得分:2)

我认为您使用的解决方案希望数据在构建时可用。您需要使用流解析器。找到一个STAX实现,你应该能够做到这一点

答案 1 :(得分:0)

看起来不像套接字的东西......否则你会看到套接字关闭异常或类似的东西。作为测试,只需读取字节并将其保存到某个文本文件中,不要担心构建文档。检查文件是否是格式正确的XML,并且编码与文档中指定的编码匹配。在文件末尾查找任何有趣的字符,可能是客户端插入一些奇怪的EOF字符或类似字符。

答案 2 :(得分:0)

自己编写一个忽略FilterInputStream的{​​{1}}派生类,并在将套接字输入流提供给close()

之前将其包装在其中