сокеты java.net, readline и разделители строк (подключение VNC)

Я использую x11vnc и хочу разработать для него простой клиент. Итак, работа такая:

  1. получить информацию из сокета
  2. отправить информацию
  3. получить следующие данные
  4. отправить другую информацию

и так далее.

So, for example, I am using the next simple code:

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);

The first message from server I got without errors (first readLine). The next message is empty (or without any line terminator for readLine) and I have infinite loop. lnr.ready() not works for me.

Итак, как я могу читать из сокета, когда данные из сокета иногда не имеют "\n", "\r", "\r\n" или если буфер сокета пуст?


person Clark    schedule 22.01.2011    source источник


Ответы (1)


Единственное сообщение RFB/VNC, заканчивающееся символом новой строки, — это обмен исходной версией. На самом деле протокол RFB/VNC несколько несовершенен в том смысле, что он не имеет уникального кадрирования сообщений; вы должны обрабатывать каждое сообщение, или вы потеряете свое место. Вероятно, вам нужно будет читать напрямую из сокета или из InputStreamReader. Обернуть его с помощью LineNumberReader не получится.

Лучший справочник, который я нашел по протоколу RFB/VNC: http://tigervnc.org/cgi-bin/rfbproto

person kanaka    schedule 23.01.2011
comment
Да, спасибо, так как же я могу читать из InputStreamReader? Какие методы я имею в виду? И когда я могу использовать LineNumberReader? Я новичок в Java и не могу понять, когда использовать такие «одинаковые» классы (не ISR и LNR, а BufferReader и тому подобное). - person Clark; 23.01.2011
comment
› Да, спасибо, а как я могу читать из InputStreamReader? * А также прямо из розетки? - person Clark; 23.01.2011
comment
@purple, метод чтения(). См. справочник по InputStreamReader. См. также справочник по LineNumberReader. - person kanaka; 24.01.2011