2010-05-09 2 views
1

Я пишу приложение клиентского сервера, но я не получаю те же байты на стороне клиента, когда они отправляются со стороны сервера. На стороне сервера я использовал метод .write(bytes[]). На стороне клиента я использовал метод .readFully(byte[]). У вас есть идеи?DataOutputStream, он теряет некоторые бит

Отправленное код:

 System.out.println("Server got connection from " + connectionFromClient.getPort()); 
     in = connectionFromClient.getInputStream(); 
     OutputStream out = connectionFromClient.getOutputStream(); 
     DataOutputStream dataOut = new DataOutputStream(out); 
     LicenseList licenses = new LicenseList(); 
     String ValidIDs = licenses.getAllIDs(); 
     System.out.println(ValidIDs); 
     Encryption enc = new Encryption(); 
     //byte[] dd = enc.encrypt(ValidIDs); 
     byte[] dd = enc.encrypt(ValidIDs); 
     String tobesent = new String(dd); 
     //byte[] rsult = enc.decrypt(dd); 
     //String tt = String(rsult); 
     System.out.println("The sent data**********************************************"); 
     System.out.println(dd); 
     String temp = new String(dd); 
     System.out.println(temp); 
     System.out.println("*************************************************************"); 
     //BufferedWriter bf = new BufferedWriter(OutputStreamWriter(out)); 
     dataOut.write(ValidIDs.getBytes()); 
     dataOut.flush(); 
     System.out.println("********Testing**************"); 
     System.out.println("Here are the ids:::"); 
     System.out.println(licenses.getAllIDs()); 
     System.out.println("**********************"); 

на стороне клиента:

  Socket connectionToServer = new Socket("127.0.0.1", 7050); 
     InputStream in = connectionToServer.getInputStream(); 
     DataInputStream dis = new DataInputStream(in); 

     int available = dis.available(); 
     byte[] data = new byte[available]; 
     // dis.readFully(data); 
     dis.read(data); 
     System.out.println("The received Data*****************************************"); 
     System.out.println(available); 
     System.out.println(data); 
     System.out.println("***********************************************************"); 
+0

Можете ли вы привести пример некоторых байтов, которые вы отправили, и того, что вы получили вместо этого? –

+0

Можете ли вы отправить код, который пишет и читать? – Zaki

+0

Вы сказали ниже, что это для проекта класса. Пожалуйста, используйте тег 'homework' в будущем для такого рода вещей. Это помогает людям лучше помочь вам, правильно настроив их ответы. –

ответ

2

Договор in.available() не гарантирует ничего. См. Выдержку из приведенного ниже API:

Обратите внимание, что хотя некоторые реализации InputStream возвращают общее количество байтов в потоке, многие не будут. Неправильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.

Ваш код в основном полагается на/предполагает, что все отправленные данные будут доступны сразу и сообщаются соответственно in.available().

Чтобы убедиться, что вы получите все данные, вы могли бы, на стороне отправителя, сначала отправив целое число, говоря, сколько байт будет отправлено:

dataOut.writeInt(theBytes.length); 

, а затем на стороне приемника использовать это число при создании массива:

byte[] data = new byte[dis.readInt()]; 

ли байты вы отправляете пришли из String? В этом случае вы должны быть осторожны с кодировкой. Отправитель и получатель могут иметь разные кодировки по умолчанию.

Вы можете, например, использовать str.getBytes("UTF-8") и new String(bytes, "UTF-8"), чтобы получатель интерпретировал байты так, как планировал отправитель.

+0

хорошо это приложение только для проекта класса, как клиент, так и серверные приложения работают на одном компьютере (мой компьютер) –

+0

, так как я могу получить все отправленные данные? не могли бы вы опубликовать фрагмент кода –

+0

, который обновил ответ. – aioobe

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