ObjectOutputStream.writeBytes(String s) неожиданные выходные значения
Я использую ObjectOutputStream
объект os для отправки сообщения String из клиентского приложения Android на сервер C++.
Я знаю, как мой MSG должен быть получен сервером: каждый символ MSG хранится в байтовом массиве (receive_msg[]). Я также знаю точное сообщение, которое сервер ожидает (через другое приложение C++).
Данные, которые я отправляю, представляют собой строку, состоящую из 1 байтового массива и 2 других строк.
Моя проблема: я уже использовал PrintWriter
чтобы отправить мои данные, но мой сервер всегда будет отображать какой-то странный символ в received_msg
, с индексами от 24 до 28. Я пытался много преобразований, чтобы исправить это, но отказался от этого. Поэтому я попытался отправить MSG с ObjectOutputStream
, С помощью клиента ObjectOutputStream.writeBytes()
Сервер показывает почти правильное полученное сообщение. Почти потому, что есть символы, которые добавляются в начале.
Как то так: На сервере receive_msg:
index 0: ┐
index 1: i
index 2: ''
index 3: |
index 4: I //beginning of the message I actually wanted to send
index 5: S //every char following index 4 is good.
пока я ожидал и ничего не послал до "Я". Сообщение, которое я отправляю, начинается так: ISOXXXXX
Поэтому мне было интересно, есть ли какие-либо способы получить РЕАЛЬНЫЙ вывод ObjectOutputStream.writeBytes. Я знаю, что это Output, а не Input, но это помогло бы мне понять, как он добавляет странный заголовок.
Заранее спасибо за ваше предложение
Моя функция отправки
private void send(String o) {
System.out.println("socket");
try {
this.socket = new Socket(serverIP, portNumber);
os = new ObjectOutputStream(socket.getOutputStream());
//OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
//InputStreamReader in = new InputStreamReader(socket.getInputStream());
// PrintWriter pw = new PrintWriter(out, true);
System.out.println("Connected to server : " + this.socket.getInetAddress() + " on port " + this.socket.getPort());
System.out.println("from local address: " + this.socket.getLocalAddress() + " and port: " + this.socket.getLocalPort());
System.out.println("02. -> Sending an object...");
ArrayList<String> tempoStr = StringToByteArray(o);
String msg="";
for(String inStr :tempoStr)
msg+=inStr;
System.out.println("the message I ACTUALLY send is\n"+msg); //the result in console is EXACTLY the message I expect.
os.writeBytes(msg); //then when I check on the server: unexpected additionnal chars at the beginning.
os.flush();
// pw.write(msg);
//pw.flush();
System.out.println("send success");
} catch (IOException e) {
e.printStackTrace();
System.out.println("XX. Exception Occurred on Sending:" + e.toString() +"\n"+ e.getCause());
System.out.println("Socket creation failure or error on sending.");
}
}
PS: я не могу изменить код сервера.
1 ответ
Не используйте ObjectOutputStream (только Java). Можно использовать DataOutputStream, но здесь кажется, что вы хотите что-то простое.
byte[] a = ...
String b = ...
OutputStream out = ...
out.write(a);
out.write((b + '\u0000').getBytes("UTF-8")); // Or "Windows-1252" / "ISO-8859-1"
out.flush();
Я добавил '\0'
как это используется в C/C++ для завершения строк (двоичный вывод). Или, может быть "\r\n"
можно ожидать (вывод текста).
Кодировка дается явно.