2016-12-09 4 views
-3

Я создаю приложение Java, которому требуется клиент для связи (Отправить & Получить данные) с другими Клиентами. Я сделал простое серверное приложение, чтобы упростить взаимодействие с клиентами. Для связи, сервер & Клиент использует класс, который я создал с именем «Запрос». Во-первых, я думал, что Simple ObjectOutputStream/InputStream сможет отправить/получить мой объект запроса, и это так! Но я изменил свои планы: Теперь я сериализую свой объект запроса как массив байтов, и я вписываю его в Cipher. Я уже сделал дешифрование & метод десериализации, но я не знаю, как читать массив байтов, соответствующий запросу. После поиска я обнаружил, что, чтобы узнать, сколько байтов я должен прочитать, мне нужно отправить int с байтом array lenth. Я также обнаружил, что существует ByteArrayOuputStream/InputStream, он адаптирован для меня? А как читать/записывать всю совокупность байтового массива? Спасибо! Хорошего дня!Как я могу узнать, что я читаю с помощью Java-сокетов?

+0

Итак, вы нарушили свой дизайн. Так что не делай этого. – EJP

+0

@EJP Что значит? Я просто добавляю шифрование к своим данным и зашифровываю его, я должен сделать его как массив байтов. – ByProcyx

ответ

1

На передающей стороне, записать длину массива байтов, а затем фактический байтовый массив:

OutputStream os = ...; 
byte[] data = ...; 
int dataLength = data.length; 
os.write(dataLength >> 24); 
os.write(dataLength >> 16); 
os.write(dataLength >> 8); 
os.write(dataLength); 
os.write(data); 

На приемной стороне, прочитать первые четыре байта, восстановить длину данных, а затем прочитать соответствующее число байтов из входного потока:

InputStream is = ...; 
byte[] buf = new byte[4]; 
is.read(buf); 
int dataLength = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3]; 
// read rest of data according to dataLength 

Примечание: Приведенные выше фрагменты кода не включают в себя необходимые санитарные проверки!

+0

Спасибо! Отлично работает: D – ByProcyx