Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-DocumentBuilder关闭套接字连接_Java_Sockets_Connection - Fatal编程技术网

Java-DocumentBuilder关闭套接字连接

Java-DocumentBuilder关闭套接字连接,java,sockets,connection,Java,Sockets,Connection,我有一个套接字连接关闭太快的问题。我被告知需要从套接字中临时加载数据并解析它。这是我的密码: ServerSocket listen = new ServerSocket(this.port); Socket server; while(i < this.maxConnections) { server = listen.accept(); processRequest(server); i++; } processXML 错误 [致命错误]:2:1:文件过早结

我有一个
套接字
连接关闭太快的问题。我被告知需要从
套接字中临时加载数据并解析它。这是我的密码:

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

while(i < this.maxConnections)
{
    server = listen.accept();
    processRequest(server);
    i++;
}
processXML 错误
[致命错误]:2:1:文件过早结束。
org.xml.sax.SAXParseException:文件过早结束。
位于com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知源)
位于com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知源代码)
在ProcessXML。(ProcessXML.java:22)
在Bank.processRequest(Bank.java:41)
在Bank.listen(Bank.java:25)
位于BankStart.main(BankStart.java:6)


现在我可以将
server.GetInputStream()
的内容存储到一个文件中,然后将其提供给
DocumentBuilder
,但我认为这是一个糟糕的解决方案。我怎样才能将内容存储到某个临时存储器中,并且能够在不关闭套接字的情况下将内容提供给
.parse()

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

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

为自己编写一个
FilterInputStream
的派生类,该类忽略
close()
,并在将套接字输入流提供给
DocumentBuilder.parse()之前将其包装在其中实际上我解决了这个问题。我只是通过扫描仪将整个InputStream加载到字符串中,并将其提供给DocumentBuilder。。。
protected void processRequest(Socket server) throws IOException
{
    ProcessXML response = new ProcessXML(server.getInputStream());

    new PrintWriter(server.getOutputStream(), true).println("response text");
}
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)