Читать Java DataOutputStream в клиенте C ++ - PullRequest
0 голосов
/ 18 января 2019

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

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

Нижняя строка:

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

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

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

Возникла такая проблема:

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

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

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

Что он посылает конкретно:

image

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

image

Здесь Java отправляет их:

image

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

Примерно так:

int IMAGE_SIZE = SOCKET.READ_SOMETHING...

byte[IMAGE_SIZE] img = ??....

Java-код:

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 ++ Код:

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;
}

Заранее благодарим вас за ответ.

...