2012-06-12 71 views
1

对不起,我重复一个topik。但我不明白这里的答案JAXB通过套接字解组问题

https://stackoverflow.com/a/9598909/1404852 “卡夫卡”说,他通过使用XMLEventWriter修复解组块。导致建议在Stream Strings中写入,然后将它们连接到解组并不适合我。

我有这样的代码。

public class InputThread implements Runnable { 
    private BufferedReader in; 
    private String fserver; // = CharBuffer.allocate(0); 
    private static final Logger LOG = Logger.getLogger(InputThread.class); 
    private JAXBContext jaxbContext; 
    private Unmarshaller jaxbUnmarshaller; 
    private XMLProtocol protocol; 

    public InputThread(Socket fromserver, BufferedReader in) throws IOException, JAXBException { 
     jaxbContext = JAXBContext.newInstance(XMLProtocol.class); 
     jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     this.in = in; 
     new Thread(this); 
    } 

    public void run() { 
     while (true) { 
      try { 
       if (in.ready()) 

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


      } 
     } 
    } 

} 

或者在服务器端我应该插入流结束?但我认为,JAXB可以做任何事情...

+0

你看到什么异常? –

+0

它阻止。因为它看不到流的结尾。 –

+0

对不起,我收到异常。 DefaultValidationEventHandler:[FATAL_ERROR]:prolog中不允许使用内容。 –

回答

0

流可以编码的长度前面,它可以结束一个特殊的字符,如EOF或服务器可以关闭连接。如果你预先编码长度,你可能需要构建一些特殊的输入流,在那些字符之后关闭它自己。这就像使用Content-Length头和流水线的HTTP。如果以EOF之类的特殊字符结束,则必须将该字符视为保留字符。另外,如上所述,您需要一个特殊的输入流。这一次它读取特殊字符时就会关闭。它不能出现在你的数据中,因为它现在是一个元字符。关闭连接就像没有流水线的HTTP一样。

+0

嗯等服务器端。编组成输出流后,我应该写EOF? –