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

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

最佳答案

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

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

10-08 12:50