当前位置: 首页 > 知识库问答 >
问题:

解组套接字流时JAXB挂起

颜文康
2023-03-14

与marshall和unmarshall的读者和作者有争议。就是这样。这就是我如何向版画作者写东西的方式。

try {

    JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    //jaxbMarshaller.setProperty(, value)
    //jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    jaxbMarshaller.marshal(protocol, out);


} catch (JAXBException e) {
    LOG.error("Error while processing protocol"+e);             
}

我是这样得到它的:

java prettyprint-override">private BufferedReader in;
private PrintWriter out;
private String buffer;
private StringBuffer stringBuffer;

public ServerThread(Socket s) throws IOException {
    socket = s;
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    start();
}

public void run() {
    try {
        while (true) {
            // LOG.trace("Waiting for input stream ready");

            /*
             * if (in.readLine().endsWith(">")) {
             *     LOG.trace("here we go"+buffer);
             *     JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
             *     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
             *     XMLProtocol protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);
             *     LOG.trace("Nop it no the end " + protocol.getContent());
             * }
             */

            if (in.ready()) {

                LOG.trace("BufferedReader - ready");
                buffer += in.readLine();
                if (buffer.endsWith("</XMLProtocol>")) {
                    LOG.trace("Wish you were here1"+in);

                    JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);

                    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

                    XMLProtocol protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);

                    LOG.trace("Getting message from user " + protocol.getContent());
                } else {

                    LOG.trace("Nop it no the end " + buffer);
                }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();

    } catch (JAXBException e) {
        e.printStackTrace();

    } finally {
        try {
            socket.close();
            LOG.trace("Socket closed");
        } catch (IOException e) {
            LOG.error("Socket no closed" + e);
        }
    }
}

然后此解组操作将挂起。它没有给我任何东西,甚至没有例外。

共有1个答案

禄烨然
2023-03-14

是的,我找到了解决这个问题的办法!JAXB不是套接字流的最佳决策,因为它等待流的结束。解决方案是使用clear SAX解析器,您可以在其中编写自己的ParserHandler(DefaultHandler.class),当到达最后一个标记时,您应该抛出自己的异常,该异常指示停止解析。

 类似资料:
  • 抱歉长帖,提前感谢! 在我的JAXB中(代码如下),我有一组值集,其中内部集被包装成一个容器类。所以,我有一组值容器,其中一个值是一个泛型类。问题:除非选择的泛型类是硬编码的,否则值不会得到解析。 关于XML的说明: >

  • 问题内容: 我根本不是Java程序员。我尽力不惜一切代价避免使用它,但是(在学校的意义上)我必须在课堂上使用它。老师要求我们使用Socket(),BufferedReader(),PrintWriter()和其他各种东西,包括BufferedReader()的readLine()方法。 基本上,这就是我遇到的问题。该文档明确指出,readLine应该在输入流的末尾返回null,但这不是正在发生的事

  • 我试图使用VMCI套接字在虚拟机和它的主机之间建立一个面向流的连接。我成功地启动了服务器,绑定了一个地址,将其置于监听模式,并调用接受来等待客户端。然而,每当我从客户端调用时,我都会收到一个错误。 我的客户代码是: 每当我使用数据报套接字时,问题并不存在。(当然,不需要调用listen、accept和connect。在这种情况下,我只需使用

  • 我正在创建服务器和客户端java应用程序。我想创建一个数组来存储我的套接字。我正在使用eclipse,当我输入这一行时: Eclipse给我一个错误说资源类型Socket[]没有实现java.lang.AutoCloseable。 我怎样才能解决这个问题? 谢谢你 尝试/捕捉语句:

  • 问题内容: 当客户端仍在加载页面时刷新时,Node一直不停地退出我(因此套接字被终止,而我仍在处理请求)。错误: 我尝试附加到: 对象 (我正在使用Express)的返回值 我的返回值,和方法。 但是,我似乎无法捕捉到该错误。它仍然被抛出,我的错误处理程序都没有反应。我可能会缺少什么? 问题答案: 将错误侦听器附加到套接字对象

  • 开始使用akka-streams,我想构建一个简单的示例。在chrome中,使用web套接字插件,我可以通过并发送2个命令,简单地连接到这样的流https://blockchain.info/api/apiwebsocket 将在chromes web socket插件窗口中传输结果。 我试图在akka流中实现相同的功能,但面临一些问题: 执行了2个命令,但我实际上没有获得流输出 同一命令执行两次