2008-11-04 16 views
2

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

我的解决方案是传递一个封装在自定义类中的InputStream,该类默默地忽略关闭请求,并指示该流在遇到第一个空行时被关闭。这限制了XML超出通常有效的范围,但客户端可以根据需要轻松地过滤输入中的空行。有更好的解决方案吗?

回答

1

您的客户如何知道何时读完了完整的信息?如果它必须读取直到输入流达到其结尾,那么按照定义,无论如何你都不能从流中读取任何东西。另一方面,在输入流上调用close()不应该关闭套接字。当您在输入流上调用close()时,确定该插座已关闭吗?当它注意到它的输出流(你的输入流)已被关闭时,连接可能被(不正确)关闭。

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

1

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

相关问题