2

我有一个 Java 服务器,它接受使用 JSSE 的 SSL 连接,并在流中使用简单的 XML 消息格式。我希望服务器阅读完整的消息,然后发送回复。事实证明这非常困难,因为 org.xml.sax.XMLReader 想要读取整个流,然后调用 close()。我知道这看起来很奇怪,但是在带有 Sun JSSE 提供程序的 Java 6 中,这确实关闭了 SSLSocket 的两端,因此没有消息可以返回。我尝试在客户端使用 Socket 的 shutdownOutput() 方法,但 JSSE 不支持此方法。

我的解决方案是传递一个包装在自定义类中的 InputStream,该类静默忽略关闭请求,并指示流在遇到第一个空行时关闭。这将 XML 限制在通常有效的范围之外,但客户端可以在必要时轻松过滤掉输入中的空白行。有更好的解决方案吗?

4

2 回答 2

1

由于每个 xml 文档只有一个根节点。因此,扫描此节点的末尾并在之后关闭流。

于 2008-11-06T20:57:07.783 回答
1

您的客户如何知道何时阅读了完整的消息?如果它必须在输入流到达其末尾之前读取,那么根据定义,之后您将无法从流中读取任何内容。第二点,close()在输入流上调用不应该关闭套接字。当您调用close()输入流时,您确定套接字已关闭吗?当对等方注意到其输出流(您的输入流)已关闭时,可能是连接(错误地)关闭。

避免在输入流结束之前读取的解决方案是以某种方式分隔输入消息。例如,您可以在消息之前发送消息的长度,然后将整个消息从流中读取到缓冲区中,然后使用 XMLReader 解析缓冲区,或者创建一个特殊的 InputStream,在指定的数量之后到达其末尾数据。或者您可以在消息之后的流中添加一个特殊的分隔符,然后当底层流产生分隔符时,您将创建一个特殊的 InputStream 到达其末尾。

于 2008-11-05T00:06:42.830 回答