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" можно ожидать (вывод текста).

Кодировка дается явно.

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