我有一个Java服务器,它使用JSSE接受SSL连接,并在流中使用简单的XML消息格式。我希望服务器读取完整的消息,然后发送回复。事实证明这很困难,因为org.xml.sax.XMLReader想要读取整个流然后调用close()。我知道这看起来很奇怪,但是在Java 6中使用Sun JSSE提供程序这确实关闭了SSLSocket的两端,因此没有消息可以返回。我尝试在客户端使用Socket的shutdownOutput()方法,但JSSE不支持。
我的解决方案是传递一个包含在自定义类中的InputStream,该类默认忽略关闭请求,并指示在遇到第一个空行时关闭流。这会将XML限制在通常有效的范围之外,但客户端可以根据需要轻松过滤输入中的空白行。有更好的解决方案吗?
答案 0 :(得分:1)
您的客户如何知道何时阅读完整的消息?如果必须读取直到输入流到达其结尾,那么根据定义,您无论如何都将无法从流中读取任何内容。在第二个注释中,在输入流上调用close()
不应该关闭套接字。在输入流上调用close()
时,您确定套接字已关闭吗?可能是对等方在注意到其输出流(您的输入流)已关闭时(错误地)关闭了连接。
避免读取直到输入流结束的解决方案是以某种方式界定输入消息。例如,您可以在消息之前发送消息的长度,然后将整个消息从流中读取到缓冲区中,然后使用XMLReader解析缓冲区,或创建一个特殊的InputStream,在指定的量之后到达它的末尾。数据。或者你可以在消息之后在流中添加一个特殊的分隔符,然后当底层流生成分隔符时你创建一个特殊的InputStream到达它的末尾。
答案 1 :(得分:1)
由于每个xml文档只有一个根节点。因此,扫描此节点的末尾并在之后关闭流。