2016-09-16 3 views
0

У меня есть класс, который служит в качестве клиентского потока. в классе у меня есть метод run, который обрабатывает операции чтения и записи из и в сокет. мой метод запуска выглядит следующим образом:не удалось уловить -1 ответ сокета читать

public void run(){ 
    System.out.println("New connection at " + new Date() + "\n"); 
    try { 
     DataInputStream in = new DataInputStream (threadSocket.getInputStream()); 
     out = new DataOutputStream (threadSocket.getOutputStream());     
     while (running){ 
      // read input from client 
      byte[] input = new byte [200]; 
      int count = in.read(input); 
      if (count == -1) { 
       running = false; 
       break; 
      } 

      String msg = new String(input, 0, count); 

      // parse in going message 
      messageParsing(msg); 

      // respond to client 
      response(); 
     } 
    } 
    catch (IOException ex) {ex.printStackTrace();} 
    finally { 
     try { 
      threadSocket.close(); 
      System.out.println("Connection closed.\n"); 
     } catch (IOException ex) {ex.printStackTrace();} 
    } 
} 

Я создал массив фиксированного размера байт, и я читать данные из сокета в него. Доступные длины поступающих данных: 147 и 61, если длина входных данных равна 0, это ничего не значит. Я хотел бы закрыть сокет, когда число равно -1, но я не увенчался успехом. Кажется, что когда нет данных, счет равен 0, он просто пытается читать данные из сокета, и он застревает.

Как решить эту проблему? Что я делаю не так? Любая помощь будет оценена по достоинству.

+0

'count' не может быть' 0', по крайней мере, если вы доверяете javadoc. – Kayaman

+0

Если вы действительно читаете текст, подумайте об использовании 'InputStreamReader', а не конструктора' String'. –

+0

@ Kayaman На самом деле это может быть, если вы предоставите буфер нулевой длины для 'read (byte [])' или нулевой счет для 'read (byte [], int, int)'. Но не с этим кодом. – EJP

ответ

1

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

+0

@ Tomas B Preusser Я пробовал несколько вещей, и ничего не работает для меня. Как вы предлагаете изменить код, чтобы он работал? Другая сторона фактически закрывает соединение. –

0

Невозможно воспроизвести. Ваш код никогда не может получить нуль от чтения. Если вы не получаете -1, это происходит потому, что сверстник никогда не закрывает соединение.

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