2013-08-03 3 views
0

Я новичок в java Сетевое программирование. Я искал код для TCP-клиента в java.I натолкнулся на следующий пример.альтернатива методу readLine() в BufferedReader?

import java.lang.*; 
import java.io.*; 
import java.net.*; 

class Client { 
    public static void main(String args[]) { 
     try { 
     Socket skt = new Socket("localhost", 1234); 
     BufferedReader in = new BufferedReader(new 
      InputStreamReader(skt.getInputStream())); 
     System.out.print("Received string: '"); 

     while (!in.ready()) {} 
     System.out.println(in.readLine()); // Read one line and output it 

     System.out.print("'\n"); 
     in.close(); 
     } 
     catch(Exception e) { 
     System.out.print("Whoops! It didn't work!\n"); 
     } 
    } 
} 

Клиент, кажется, считывает данные по одной «линии» за раз ?. Я подключаюсь к серверу, который передает потоки пакетов OpenFlow. Ниже приведена скриншот пакетов OpenFlow.

[http://www.openflow.org/downloads/screenshot-openflow-dissector-2008-07-15-2103.jpg][1]

После того, как я получаю полные пакеты Я хочу сбросить что к файлу, а затем позже прочитайте его, используя, например, wirehark. В приведенном выше коде они используют calss BufferedReader для чтения данных в «строках»? По крайней мере, так я понимаю. Есть ли там какие-то способы, в которых я могу получить полные пакеты, а затем записать их в файл?

+0

Одна проблема здесь - вызов ready(). Это гарантирует, что читатель перестанет читать преждевременно. Другой закрывает сокет внутри цикла, а затем снова читает. Очень странный пример. – EJP

ответ

2

Читатели предназначены для работы с текстовыми данными. Если вы работаете с двоичными данными (это не совсем понятно из этого снимка экрана), вы должны работать с каким-то потоком (InputStream или, возможно, DataInputStream). Не просто искать случайные примеры в Интернете, попробуйте найти те, которые на самом деле применяются к тому, что вас интересует.

также, никогда не используйте InputStream.available, это почти бесполезно. как и любой пример кода, использующий его.

также, простой поиск Google для «OpenFlow java» имел интересные хиты. вы уверены, что вам нужно что-то написать с нуля?

2

Нет, но есть библиотеки, которые предоставляют такие функции. Смотрите, например, гуавы

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/ByteStreams.html

Если вы не хотите (или не можете) использовать библиотеки вы Шоуда потребляют поток, как это

List<String> lst = new ArrayList<String>(); 
String line; 
while ((line = in.readLine()) != null) { 
    lst.add(line); 
} 

или

String str = ""; 
String line; 
while ((line = in.readLine()) != null) { 
    str += line + "\n"; 
} 

Обратите внимание, что метод BufferedReader.readLine() даст вам новую строку в linebreaks ('\ n'). Если InputStream является двоичным, вы должны работать с байтами.

+0

Пожалуйста, не поощряйте плохой стиль ... например (случайные) префиксы подчеркивания для локальных переменных. Прочтите руководство по стилю Sun/Oracle Java для конвенций, которым вы должны следовать. –

+0

Кроме того, второй пример будет ужасно неэффективным, если вы прочитаете много строк. Это случай, когда вы * должны * использовать 'StringBuilder'. –

Смежные вопросы