2013-07-12 2 views
3

Я хочу читать все данные, синхронно, получать с клиента или сервера без readline() метод в java (например, readall() в C++).
Я не хочу использовать что-то вроде кода ниже:Читать все данные из сокета

BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getInputStream())); 
String line = null; 
while ((line = reader.readLine()) != null) 
    document.append(line + "\n"); 

Какой метод я должен использовать?

+0

Каково ваше возражение против использования кода, который вы опубликовали? – EJP

+0

Почему вы хотите получить все данные? Общей путаницей в использовании Sockets является предположение, что оно поддерживает прием сообщений, и если вы можете сразу прочитать все данные, вы можете прочитать одно целое «сообщение». Хотя это может показаться работающим в TCP при низкой нагрузке со временем между «сообщениями», TCP не поддерживает это, и это не работает надежно esp под нагрузкой. Если вам нужен протокол на основе сообщений, вы можете попробовать SCTP в Java 7 или использовать TCP так, как он был предназначен, в качестве протокола потоковой передачи. –

+0

что-то вроде браузера никогда не посылает null wile подключен и ждет ответа ... я хочу читать все заголовки и данные одновременно и синхронно! –

ответ

3

Если вы знаете размер входных данных можно использовать метод, как:

public int read(char cbuf[], int off, int len) throws IOException; 

где cbuf является буфер назначения.

В противном случае вам нужно будет прочитать строки или прочитать байты. Потоки не знают о размере входящих данных. Можно только последовательно читать до конца не будет достигнут (метод чтения возвращает -1)

см здесь streams doc

STH так:

public static String readAll(Socket socket) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) 
     sb.append(line).append("\n"); 
    return sb.toString(); 
} 
+0

и если я не знаю? –

+0

Я привел вам пример, потому что есть еще одна важная вещь: вы должны использовать StringBuilder вместо конкатенирования строк. – Tala

+0

+1 Примечание: это будет читать все символы. Если есть неполные многобайтные символы, они будут храниться в буфере и появляться позже. –

1

Вы могли бы использовать что-то вроде этого:

public static String readToEnd(InputStream in) throws IOException { 
     byte[] b = new byte[1024]; 
     int n; 
     StringBuilder sb = new StringBuilder(); 
     while ((n = in.read(b)) >= 0) { 
     sb.append(b); 
     } 
     return sb.toString(); 
    } 
Смежные вопросы