Отправка данных между клиентом и сервером в виде массива байтов

#java #arrays #networking #encryption

#java #массивы #сеть #шифрование

Вопрос:

Я пытаюсь отправить зашифрованные данные между клиентом и сервером. Из-за шифрования RSA его в форме массива байтов. Это означает, что мне пришлось изменить способ отправки данных. В настоящее время я не могу заставить его работать, я оставлю свой метод (SendMessage) ниже, который обрабатывает отправку сообщения, если кто-нибудь может сказать мне, что я делаю неправильно, это было бы здорово 🙂

  public void sendMessage(byte[] msg){ 
        if(msg.equals("null")){
                
                
        }        
        else{
            try{
            ByteArrayOutputStream f = new ByteArrayOutputStream(CSocket.getOutputStream());
            out = new PrintWriter(f);
            out.write(msg);
            countSend  ;
            }catch (IOException e){
                System.out.println("ERROR");
            }
        }       
 
    }  


 

Извините, я должен был уточнить, по сути, CSocket — это открытый сокет, и я хочу отправить сообщение через сокет. Проблема, с которой я сталкиваюсь конкретно с этим кодом, заключается в том, что OutputStream can not be converted to int в строке, где я создаю ByteArrayOutputStream объект f , и No suitable method found for write(byte[]) в строке out.write(msg);

Комментарии:

1. Не могли бы вы описать, что вы ожидаете, и что на самом деле происходит?

2. Привет, я добавил еще несколько деталей выше. По сути, я вызываю этот метод для отправки сообщения о массиве байтов клиенту / серверу на другой стороне соединения. Я ожидал бы, что массив байтов будет отображаться на другом подключенном компьютере, но в настоящее время я получаю ошибку, о которой я уже говорил выше. Любая помощь будет очень признательна @KajHejer

3. Я не уверен, почему вы здесь возитесь ByteArrayOutputStream , он не делает ничего, что вы хотите. Просто используйте правильный метод OutputStream для отправки байтов.

4. Приветствую, приятель, это немного помогло, я все еще не уверен, как отформатировать out.write , но я работаю над этим 🙂

Ответ №1:

Спасибо за разъяснение! Пожалуйста, смотрите https://docs.oracle.com/javase/10/docs/api/java/io/ByteArrayOutputStream.html#write(byte[],int,int)

Методу write в ByteArrayOutputStream для byte[] требуется еще два аргумента. Может сработать что-то вроде следующего:

 out.write(msg, 0, msg.length);
 

Пожалуйста, дайте мне знать, если это полезно.

Комментарии:

1. Конструктор ByteArrayOutputStream принимает только параметр int. Вы, вероятно, имели в виду ByteArrayOutputStream f = CSocket.getOutputStream();

2. Итак, я попытался ввести ByteArrayOutputStream f = CSocket.getOutputStream(); , и я также изменил выход. запись в out.write(msg, 0, msg.length) . Проблема с первым изменением заключается в том, что в нем указано output stream can not be converted to byte output stream , а вторая проблема заключается no suitable method found for write(byte[],int,int) в том, что вторая ошибка, которую я не понимаю, поскольку в документе в нем буквально указано, что он хочет его в этом формате public void write​(byte[] b, int off, int len) . Спасибо за помощь, ребята, очень благодарны 🙂

3. ByteArrayOutputStream f = (ByteArrayOutputStream) CSocket.getOutputStream(); Кажется, это работает, но я действительно не знаю, что это за формат, ага. * редактировать — это определенно сложная работа, я не знаю, о чем я думал

4. Приятно видеть, что все идет правильно 🙂 Работает ли метод записи и сейчас после последнего изменения?

5. Пока нет, я играю с ним в данный момент, я не уверен, почему ему не нравится предложенный вами формат.

Ответ №2:

Я думаю, что теперь я исправил свою проблему. Вероятно, это не самый эффективный способ сделать это, но по сути я кодирую массив байтов в формате, который означает, что я не потеряю никаких данных. Это означает, что я отправляю их в этом закодированном формате, а затем в конце получения я просто декодирую их. Работает намного лучше, когда print writer делает это таким образом.

 OutputStream f = CSocket.getOutputStream();
out = new PrintWriter(f);
String encodedmsg = new String(msg, "ISO-8859-1"); // ISO-8859-1 is supposed to give every character a unique representation so I shouldent loose any data during encoding and decoding
out.write(encodedmsg);