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

Я пытаюсь отправить зашифрованные данные между клиентом и сервером. Из-за шифрования 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);

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

Kaj Hejer 17.12.2020 20:18

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

FocusedTerror96 17.12.2020 20:33

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

President James K. Polk 17.12.2020 21:30

Ура, приятель, это немного помогло, я все еще не знаю, как отформатировать out.write, но я работаю над этим :)

FocusedTerror96 17.12.2020 21:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
457
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Благодарю за разъяснение! См. https://docs.oracle.com/javase/10/docs/api/java/io/ByteArrayOutputStream.html#write(byte%5B%5D,int,int)

Методу записи в ByteArrayOutputStream для byte[] нужны еще два аргумента. Что-то вроде следующего может работать:

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

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

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

Jonathan Rosenne 17.12.2020 20:52

Итак, я попытался ввести ByteArrayOutputStream f = CSocket.getOutputStream();, а также изменил out.write на 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). Спасибо за помощь до сих пор, ребята, очень благодарны :)

FocusedTerror96 17.12.2020 21:24

Кажется, это работает ByteArrayOutputStream f = (ByteArrayOutputStream) CSocket.getOutputStream(); Но я на самом деле не знаю, что это за формат, ага.

FocusedTerror96 17.12.2020 21:34

Приятно видеть, что все идет по правильному пути :) Метод записи теперь также работает после последнего изменения?

Kaj Hejer 17.12.2020 21:41

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

FocusedTerror96 17.12.2020 21:49

Хорошо, держите нас в курсе :)

Kaj Hejer 17.12.2020 21:50

К сожалению, пока не повезло, я рыскал по Интернету и пробовал небольшие настройки, такие как int Length = msg.length; out.write(msg, 0, Length); Но это не сработало, я нашел это только сейчас, но я не знаю, действительно ли это соответствует моим потребностям: baeldung.com/java-convert- массив байтов для записи

FocusedTerror96 18.12.2020 13:04
Ответ принят как подходящий

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

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);

Другие вопросы по теме