Я пытаюсь отправить зашифрованные данные между клиентом и сервером. Из-за шифрования 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);
Привет, я добавил некоторые подробности выше. По сути, я вызываю этот метод для отправки массива байтов msg клиенту/серверу на другой стороне соединения. Я ожидаю, что массив байтов будет отображаться на другой подключенной машине, но в настоящее время я получаю сообщение об ошибке, которое я указал выше. Любая помощь будет очень признательна @KajHejer
Я не уверен, почему вы возитесь с ByteArrayOutputStream
здесь, это не делает ничего, что вы хотите. Просто используйте правильный метод OutputStream
для отправки байтов.
Ура, приятель, это немного помогло, я все еще не знаю, как отформатировать out.write
, но я работаю над этим :)
Благодарю за разъяснение! См. 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();
Итак, я попытался ввести 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)
. Спасибо за помощь до сих пор, ребята, очень благодарны :)
Кажется, это работает ByteArrayOutputStream f = (ByteArrayOutputStream) CSocket.getOutputStream();
Но я на самом деле не знаю, что это за формат, ага.
Приятно видеть, что все идет по правильному пути :) Метод записи теперь также работает после последнего изменения?
Пока нет, я играю с ним в данный момент, я не уверен, почему ему не нравится формат, который вы предложили.
Хорошо, держите нас в курсе :)
К сожалению, пока не повезло, я рыскал по Интернету и пробовал небольшие настройки, такие как int Length = msg.length; out.write(msg, 0, Length);
Но это не сработало, я нашел это только сейчас, но я не знаю, действительно ли это соответствует моим потребностям: baeldung.com/java-convert- массив байтов для записи
Я думаю, что исправил свою проблему сейчас. Вероятно, это не самый эффективный способ сделать это, но, по сути, я кодирую массив байтов в формате, который означает, что я не потеряю никаких данных. Это означает, что я отправляю его в этом закодированном формате, а затем на принимающей стороне просто декодирую его. Работает намного лучше, когда печатный писатель делает это таким образом.
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);
Не могли бы вы описать, что вы ожидаете, и что происходит на самом деле?