我有一个Java服务器,它使用JSSE接受SSL连接,并在流中使用简单的XML消息格式。我希望服务器读取完整的消息,然后发送回复。这被证明是相当困难的,因为org.xml.sax.XMLReader希望读取整个流,然后调用close()。我知道这看起来很奇怪,但在带有Sun JSSE提供者的Java6中,这确实关闭了SSLSocket的两端,因此消息不能返回。我尝试在客户端使用套接字的shutdownOutput()方法,但JSSE不支持这样做。
我的解决方案是传递一个封装在自定义类中的InputStream,它会默默地忽略close请求,并在遇到第一个空行时指示流已关闭。这限制了XML超出通常有效的范围,但是如果需要的话,客户端可以很容易地过滤掉输入中的空行。有没有更好的解决方案?
发布于 2008-11-05 00:06:43
您的客户端如何知道何时读取了完整的消息?如果它必须读到输入流的末尾,那么,根据定义,你无论如何都不能从流中读取任何东西。第二点,在输入流上调用close()不应该关闭套接字。您确定在输入流上调用close()时套接字已关闭吗?当对等体注意到它的输出流(您的输入流)已经关闭时,连接可能(错误地)被关闭。
一种避免读取直到输入流结束的解决方案是以某种方式分隔输入消息。例如,您可以在消息之前发送消息的长度,然后将整个消息从流中读取到缓冲区中,然后使用XMLReader解析缓冲区,或者创建一个特殊的InputStream,该its在指定的数据量之后到达缓冲区的末尾。或者,您可以在消息之后的流中添加一个特殊的分隔符,然后在底层流生成分隔符时创建一个到达其末尾的特殊InputStream。
发布于 2008-11-06 20:57:08
因为每个xml文档只有一个根节点。因此,扫描此节点的末尾,然后关闭流。
https://stackoverflow.com/questions/263406
复制相似问题