2013-10-05 2 views
1

В цикле, этот код работает (на стороне сервера):Java чтение из сокета

try { 
     BufferedInputStream is = new BufferedInputStream(cnn.getInputStream()); 
     InputStreamReader isr = new InputStreamReader(is); 
     int character; 
     StringBuffer process = new StringBuffer(); 
     while ((character = isr.read()) != 13) { 
      process.append((char) character); 
     } 
     println("Input: " + process.toString()); 
} catch (Exception e) { } 

клиент ничего не посылает, но process.toString() выводит бесконечные вопросительные знаки. переменная is выводит это: [email protected] (последнее число постоянно меняется)

это не вход должен быть пустым и падают обратно catch блока, если клиент ничего не посылать?

Что я делаю неправильно?

примечание: цикл while продолжается вечно, потому что нет конца для ввода, я смог увидеть вопросительные знаки, исходящие, поставив предел 100 символов в переменную process.

+2

Является ли клиент закрытием гнезда? Потому что если так, 'isr.read()' будет продолжать возвращать -1 ... О, и печать результата 'InputStreamReader.toString()' никогда не будет делать ничего полезного. –

+0

Вы немного изменили этот код, прежде чем опубликовать его. Например, процесс называется thread_process – monkjack

+0

Да, я стараюсь убирать и очищать свой код перед его отправкой во избежание хаоса/путаницы. – Laurent

ответ

1

? знаки, вероятно, потому, что источник потока возвращает -1, чтобы указать конец потока. Но цикл while ждет возврата каретки.

Звонок read блокирует и будет ждать ввода. Только если он обнаруживает конец конца потока или в каком-то ошибочном состоянии генерирует исключение.

Предполагаю, что вы читаете строки. Было бы эффективно использовать BufferedReader вместо чтения байта байтом.

Итак, если вы читали стандартный ввод. Вы могли бы сделать что-то вроде:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(new BufferedInputStream(System.in))); 

try { 
    StringBuilder result = new StringBuilder(); 

    for (String line = null; (line = reader.readLine()) != null;) { 
     result.append(line); 
    } 
    //process result 
    System.out.println(result); 
} catch (IOException e){ 
    e.printStackTrace(); 
} 

toString метод InputStreamReader не перегружена.

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