Как проверить, получает ли InputStream пустую и / или нулевую строку? - PullRequest
0 голосов
/ 02 мая 2018

если я отправлю объект List на сервер через ObjectOutputStream, который имеет значение null, тогда я получу исключение. Итак, я хочу проверить, является ли ObjectInputStream на стороне сервера пустым. Но я не знаю, как это сделать.

ни ois.available (), ни ois.readObject! = Null не работает.

Вот пример кода: Клиент:

String str= null;//"Hello \n";


        //Nachricht mit AES verschlüsseln und an Server senden

        cipherAES.init(Cipher.ENCRYPT_MODE, encryptionKey, iv);
         byte[] input = str.getBytes();
         byte[] ctLength = cipherAES.doFinal(input);

         List<Byte> messageToServer = new ArrayList<>();
         for(int i = 0; i < ctLength.length; i++){

             messageToServer.add(ctLength[i]);

         }
 //3. OUTPUTSTREAM#############################################################################  
         oos.writeObject(messageToServer);
        os.flush();

Сервер

//3.INPUTSTREAM#####################################################################         
       //ois.availale();At this place, it doesnt work. if List<Byte> isn't null result = 0;

       //Empfange Clients verschlüsselte Nachricht          
      List<Byte> encryptedMessageFromClient = (List<Byte>) ois.readObject();
     // At this place ois.available retruns the value of the Object, if the object isnt null;

   //#####################################################################

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Решено. Там нет патентных средств правовой защиты. Итак, если у вас есть несколько ObjectInputStreams, тогда работайте с «instanceof» или «! Instanceof».

Обратите внимание: instanceof не принимает generic-объекты.

Редактировать: Пример кода: Клиент:

    if (str != null){
        //Nachricht mit AES verschlüsseln und an Server senden

    cipherAES.init(Cipher.ENCRYPT_MODE, encryptionKey, iv);
     byte[] input = str.getBytes();
     byte[] ctLength = cipherAES.doFinal(input);

     List<Byte> messageToServer = new ArrayList<>();
     for(int i = 0; i < ctLength.length; i++){

         messageToServer.add(ctLength[i]);

     }
      //3. 

    OUTPUTSTREAM##############################################
     oos.writeObject(messageToServer);
    os.flush();
       }

Пример кода Сервер:

             //3.INPUTSTREAM######################################

  Object readed = ois.readObject();

//##################################################
      if(!(readed instanceof requiredObject)){
           objectYouNeed = (cast_it)Object;
        }else
          {
            --> Go on with another Object which is in the stream
         }
0 голосов
/ 02 мая 2018

Если вы сериализуете List, который содержит нулевое значение с помощью writeObject (), и попытаетесь десериализовать его в конце сервера, вы снова получите null.

У нас нет метода objectOutputStream.available (), но у нас есть objectInputStream.available (), который возвращает количество байтов, которые можно прочитать без блокировки.

Обратите внимание, что

ObjectOutputStream в Java может использоваться для преобразования объекта в OutputStream. Процесс преобразования объекта в поток называется сериализацией в Java.

и

Класс Java ObjectInputStream (java.io.ObjectInputStream) позволяет вам читать объекты Java из InputStream вместо просто необработанных байтов. Вы оборачиваете InputStream в ObjectInputStream и затем можете читать объекты из него. Конечно, прочитанные байты должны представлять действительный сериализованный объект Java. В противном случае чтение объектов не удастся.

...