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