Всех приветствую.
Все еще пытаюсь создать приложение видео straming'a (клиент-сервер-клиент).
Нижняя строка:
Есть 2 клиента. 1 - отправитель, 2 - получатель.
1 отправляет размер картинки, само изображение. Сервер получает и отправляет его сначала по размеру изображения, а затем само изображение другому клиенту.
Для сокета C ++ я использую BOOST :: Asio.
Возникла такая проблема:
Мне нужно в C ++ сначала получить размер изображения, которое отправляет Java, а затем записать само изображение в массовых байтах.
При чтении изображения с помощью Java DataInputStream (на стороне сервера) - никаких проблем не возникает.
Но если я пытаюсь получить образы Java-сервера в C ++, возникает огромная проблема в том виде, что я даже не знаю, что отправляет сервер.
Что он посылает конкретно:
Как я заметил здесь, C ++ по-прежнему производит символ начала чтения размера изображения и символ конца размера изображения:
Здесь Java отправляет их:
Как я могу получить размер полученного изображения, а затем записать все изображение, например, в байте [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;
}
Заранее благодарим вас за ответ.