2011-01-22 5 views
0

x11vnc를 사용하고 있는데 간단한 클라이언트를 개발하고 싶습니다. 그래서 작업은 다음과 같습니다 소켓 java.net 소켓, readline 및 라인 종결 자 (VNC 연결)

  • 에서

    1. 를 받게되며 정보는

    그래서,에 보내 다른 정보를

  • 을 정보를
  • 를 받게되며을 보내 다음 데이터 예를 들어 다음 간단한 코드를 사용하고 있습니다.
     
    LineNumberReader lnr = new LineNumberReader(new InputStreamReader(socket.getInputStream())); 
    String test = null;

    try { 
         test = lnr.readLine(); 
         System.out.println(test); 
         test = lnr.readLine(); 
         System.out.println(test); 
        } catch (IOException ex) { 
         Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
        } 
        System.exit(0); 
    

    서버에서 보낸 첫 번째 메시지가 오류없이 나타납니다 (첫 번째 readLine). 다음 메시지는 비어 있거나 (또는 ​​readLine에 대한 줄 종결 자없이) 무한 루프가 있습니다. lnr.ready()가 작동하지 않습니다.

    그렇다면 소켓의 데이터에 "\ n", "\ r", "\ r \ n"이 없거나 소켓 버퍼가 비어 있으면 어떻게 읽을 수 있습니까?

  • 답변

    2

    개행으로 인해 종료되는 유일한 RFB/VNC 메시지는 초기 버전 교환입니다. 실제로 RFB/VNC 프로토콜은 고유 한 메시지 프레이밍이 없다는 점에서 다소 불완전합니다. 당신은 모든 메시지를 처리해야합니다. 그렇지 않으면 당신은 당신의 자리를 잃을 것입니다. 아마 소켓이나 InputStreamReader에서 직접 읽어야 할 것이다. LineNumberReader로 랩핑하면 작동하지 않습니다.

    내가 RFB/VNC 프로토콜을 발견하는 가장 좋은 참조 : http://tigervnc.org/cgi-bin/rfbproto

    +0

    네, 감사합니다, 그래서 InputStreamReader에서 읽을 어떻게? 무슨 뜻이야? 그리고 언제 LineNumberReader를 사용할 수 있습니까? 나는 Java에 익숙하지 않고 이러한 동일한 클래스 (ISR과 LNR가 아니라 BufferReader와 같은 클래스)를 사용해야 할 때를 이해할 수 없습니다. – purple

    +0

    > 네, 고마워요, 그래서 어떻게 InputStreamReader에서 읽을 수 있습니까? * 또한 소켓에서 직접? – purple

    +0

    @purple, read() 메소드 [InputStreamReader reference] (http://download.oracle.com/javase/1.4.2/docs/api/java/io/InputStreamReader.html)를 참조하십시오. 또한 [LineNumberReader reference] (http://download.oracle.com/javase/1.5.0/docs/api/java/io/LineNumberReader.html)를 참조하십시오. – kanaka