gpt4 book ai didi

java - 解码套接字的 InputStream 会关闭套接字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:19 25 4
gpt4 key购买 nike

我有一个服务器-客户端架构,其中客户端将 XML 发送到服务器,服务器读取它并从中生成 PDF,然后将其发送回客户端。

在客户端:

JAXBElement<Xml> xml = ...
Socket sock = ...
Marshaller marshaller = ...
marshaller.marshal(xml, sock.getOutputStream());
sock.shutdownOuput();

同时在服务器端:

ServerSocket server = ...
Socket client = server.accept();
Unmarshaller unmarshaller = ...
// client.isClosed() -> false
JAXBElement<Xml> xml =
(JAXBElement<Xml>)) unmarshaller.unmarshall(client.getInputStream());
// client.isClosed() -> true
Pdf pdf = new Pdf(xml);
client.getOutputStream().write(pdf.toBytes());
// "socket is closed" IOException is thrown

如果我不解码客户端的 InputStream(在服务器端)并且只发回一个虚拟 PDF,那么一切都会顺利进行。所以,我必须假设 Unmarshaller 关闭了给定的 InputStream,从而隐式关闭客户端 Socket 毁了我的一天...

有解决这个问题的想法吗?

最佳答案

类 XMLEntityManager 在 InputStream 上调用关闭。

您可以使用 FilterInputStream以避免底层流的 close() 调用。

子类 FilterInputStream 并用一个空主体覆盖 close() 方法:

public class MyInputStream extends FilterInputStream {
public MyInputStream(InputStream in) {
super(in);
}

@Override
public void close() {
// do nothing
}
}

然后将您的 unmarshall() 调用更改为

JAXBElement<Xml> xml =
(JAXBElement<Xml>)) unmarshaller.unmarshall(new MyInputStream(client.getInputStream()));

因此 JAXB 框架仍会调用流上的 close(),但它现在已被您自己的流实例过滤掉并且套接字流保持打开状态。

关于java - 解码套接字的 InputStream 会关闭套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799714/

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