2016-09-04 2 views
0

Я все еще относительно новый для раструба, поэтому я столкнулся с небольшой проблемойгнезда не принимает данных после отправки

У меня есть мое приложение для Android, который дал поручение, чтобы послать массив байт через сокет, а затем сервер (также сделанный в java) получает данные, и при необходимости он отправляет ответ клиенту.

В практике то, что я получаю это:

  1. Сервер переходит на
  2. App подключается к серверу
  3. App посылает массив байтов
  4. Сервер получает данные
  5. сервер проверяет Theres любое сообщение, которое будет отправлено назад
  6. если да, отправьте данные
  7. Приложение не распознает InputStream

Клиентская сторона

//infinite loop 
     while(true) { 
      //client has anything to be sent 
      if (msg != null) { 
       //open output stream 
       OutputStream outputStream = socket.getOutputStream(); 
       DataOutputStream dataOutputStream = new DataOutputStream(outputStream); 

       if (msg.length > 0) { 
        dataOutputStream.write(msg, 0, msg.length); 
        dataOutputStream.flush(); 
        outputStream.flush(); 
        //send message (byte array) 
       } 

       InputStream inputStream = socket.getInputStream(); 
       if (inputStream.available() > 0) { 
        //never gets in this statement 
        DataInputStream dataInputStream = new DataInputStream(inputStream); 
        String msg = dataInputStream.readUTF(); 
        socket.shutdownInput(); 
       } 
       disconnect(); 
      } 
     } 

Сервер

try { 
      //server inputstream 
      InputStream inputStream = client.getInputStream(); 
      //sucessfully goes in 
      if(inputStream.available() > 0) { 
       BufferedReader inReader = new BufferedReader(new InputStreamReader(inputStream)); 
       ByteArrayOutputStream output = new ByteArrayOutputStream(); 
       //receives all of this properly, no problems 
       try (FileOutputStream fos = new FileOutputStream(filename)) { 
        int size = 1024; 
        int filesize = client.getReceiveBufferSize(); 
        byte[] buffer = new byte[1024]; 

        int bytesReceived; 
        while((bytesReceived = inputStream.read(buffer, 0, size)) > -1) { 
         fos.write(buffer, 0, bytesReceived); 
         output.write(buffer, 0, bytesReceived); 
        } 
        fos.close(); 
       } 


       String message = frame.getMessage(); 
       if(message.length() > 0) { 
        try { 
         //goes in here, no problem 
         OutputStream outputStream = client.getOutputStream(); 
         DataOutputStream dos = new DataOutputStream(outputStream); 
         dos.writeUTF(message); 
         //writes the utf properly no problem 
         dos.close(); 
         outputStream.close(); 
        } catch (IOException ex) { 
         Logger.getLogger(ReceiveDataThread.class.getName()).log(Level.SEVERE, null, ex); 
        } 
        System.out.println("Message '"+message+"' has been sent to " + frame.getConnection().getIp()); 
        //all ok 
       } 
       client.close(); 
       client = null; 
       Thread.currentThread().interrupt(); 
      } 

     } catch (IOException ex) { 
      Logger.getLogger(ReceiveDataThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Теперь, почему не клиент получения ответа UTF сервера?

ответ

0

Не специалист по сокетов, но я думаю, что ваша ошибка может быть клиентом, здесь:

if (inputStream.available() > 0) { 
        //never gets in this statement 
        DataInputStream dataInputStream = new DataInputStream(inputStream); 
        String msg = dataInputStream.readUTF(); 
        socket.shutdownInput(); 
       } 

Метод available() не блокирует, а это означает, что если нет ничего, чтобы сразу прочитать после того, как сообщение было отправлено, available() вернет 0.

То, что вы хотите сделать, это избавиться от этого, если условие, и сосредоточить внимание на этой линии вы писали:

String msg = dataInputStream.readUTF(); 

readUTF() блокирует, то есть ваш код остановится здесь, пока сокет не получит что-то.