Чтение Java DataOutputStream в C++

132
17 августа 2019, 20:40

Всех приветствую.

Все еще пытаюсь создать приложение video straming'a (client-server-client).

Суть:

Есть 2 клиента. 1 - отправитель, 2 - получатель.

1 шлет размер картинки, саму картинку. Сервер её получает и отправляет сначала размер картинки, а потом и саму картинку, другому клиенту.

Для C++ сокета я использую BOOST::Asio.

Появилась такая проблема:

Мне нужно на C++ сначала получить размер изображения, который отсылает Java, а затем и само изображение записать в массов байтов.

При чтении изображение Java'вским DataInputStream (на стороне сервера) - проблем никаких не возникает.

Но если я попытаюсь получать изображения Java сервера на C++ - появляется огромная проблема, в виде того, что я даже не знаю, что шлет сервер.

Что он шлет конкретно:

Как я тут заметил, C++ все же выдает символ начала чтения размера изображения и символ конца размера изображения:

Вот тут Java их отсылает:

Как мне можно получить размер получаемого изображения, а далее записать все изображение, к примеру, в byte[IMG_SIZE]?

Что-то типа такого:

int IMAGE_SIZE = SOCKET.READ_SOMETHING...
byte[IMAGE_SIZE] img = ??....

Java code:

private void ReadImage(){
        while (true) {
            try {
                int token = is.readInt();
                if (token == 4) {
                    dos.writeInt(4);
                    if (is.readUTF().equals("#@@#")) {
                        dos.writeUTF("#@@#");
                        int imgLength = is.readInt();
                        is.readUTF();
                        listener.onDataReceived(imgLength);
                        dos.writeInt(imgLength);
                        dos.writeUTF("-@@-");
                        dos.flush();
                        byte[] buffer = new byte[imgLength];
                        int len = 0;
                        while (len < imgLength) {
                            len += is.read(buffer, len, imgLength - len);
                        }
                        dos.write(buffer);
                        dos.flush();
                    }
                }
            } catch (Exception e) {
                try {
                    ReconnectSockets();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

C++ Code:

void DataManager::ReadData()
{
    boost::array<char, 40000> buf;
    boost::system::error_code error;
    size_t len = socket.read_some(boost::asio::buffer(buf), error);
    string data(buf.begin(), buf.end());
    cout << data << endl;
}

Заранее благодарю за ответ.

READ ALSO
Найти самый яркий пиксель из заданной области превью камеры

Найти самый яркий пиксель из заданной области превью камеры

Задача: В любую область камеры идет нажатие на экранОбласть нажатия выделяется синим квадратом

119
Импорт библиотеки в Java

Импорт библиотеки в Java

Не получается сделать импорт библиотеки ArrayUtilsПри импорте возникает ошибка error: package org

111
Как показать ProgressBar во время загрузки данных для RecyclerView?

Как показать ProgressBar во время загрузки данных для RecyclerView?

Есть RecyclerView с картинками, которые загружаются из интернетаКак надо подключить ProgressBar, пока данные для RecyclerView грузятся? Вот код фрагмента

134
зачем две скобки вместе в конце кода?

зачем две скобки вместе в конце кода?

java зачем в конце блока }); стоит фигурная и круглая вместе вместе?

113