gpt4 book ai didi

java - 通过 JSSE 连接结束 XML 流?

转载 作者:行者123 更新时间:2023-11-30 09:58:54 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于java - 通过 JSSE 连接结束 XML 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/263406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com