2012-06-12 5 views
1

나는 토픽을 반복하는 사람들을 죄송합니다. 하지만 난 여기에 대답을 이해하지 못합니다소켓을 통한 JAXB 언 마샬링 문제

https://stackoverflow.com/a/9598909/1404852 "Kafka"는 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] : 내용이 프롤로그에서 허용되지 않습니다. –

답변

0

스트림은 길이를 앞쪽으로 인코딩 할 수 있으며, EOF와 같은 특수 문자로 끝나거나 서버가 연결을 닫을 수있다. 길이를 앞에서 인코딩하는 경우에는 여러 문자 다음에 닫히는 일종의 특수 입력 스트림을 만들어야합니다. 이는 HTTP와 Content-Length 헤더 및 파이프 라이닝과 같습니다. EOF와 같은 특수 문자로 끝내면 그 문자를 예약 된 것으로 취급해야합니다. 또한 위와 같이 특수 입력 스트림이 필요합니다. 이번에는 특수 문자를 읽을 때 가까와졌습니다. 이제 메타 문자이므로 데이터에 표시 할 수 없습니다. 그리고 연결을 닫는 것은 파이프 라이닝없이 HTTP와 같습니다.

+0

흠 그래서 서버쪽에. 마샬링 후 출력 스트림에 EOF를 써야합니까? –

관련 문제