Отправка структуры через Сокет с помощью JAVA и C++

У меня есть сокет, где сервер находится в JAVA, но Клиент находится в C++.

Struct{ 
   float length; 
   char[] name; 
}myStruct;

Как я могу преобразовать структуры в поток байтов, отправленный Сервером, и могу быть правильно проанализирован Клиентом? Любой пример кода помог бы! (Я слышал, что XML является опцией, но я не знаком с ним), Спасибо.

5
задан looktt 4 February 2010 в 18:46
поделиться

5 ответов

Попробуйте использовать протокол Google буферы , размещенные на странице ProtocolBuffers в Google Code. Небольшой, эффективный, поддержка Python, Java и C ++. Похоже, это хорошо соответствует вашим потребностям.

Меньше накладных расходов, чем подход XML, и лучше, чем накатать собственный - это сложнее, чем вы думаете.

9
ответ дан 18 December 2019 в 13:13
поделиться

Рассмотрите JSON для простоты (что-то вроде JSONRPC, или просто создайте собственный JSON)
для Thrift для сложности

{ {1}}
0
ответ дан 18 December 2019 в 13:13
поделиться

XML не делает "Магия"
. можно использовать XML или простой текст
. думать о том, что бы ты делал, работая с файлами.
вы бы использовали jave для записи данных в файл
. тогда вы можете использовать c++ для чтения этого файла.

то же самое с сокетом
. XML не является особенным. Простой текст может выполнять работу
. XML только добавляет структуру

я бы не предложил реализовать сериализацию самостоятельно для тяжелых задач

вы можете рассмотреть возможность использования JNI/JNA лучший способ - это использовать корбу, но это может быть перебор

.
2
ответ дан 18 December 2019 в 13:13
поделиться

Использовать JSONRPC http://www.json.org/

Очень легко сгенерировать, очень легко проанализировать. На главной странице есть готовые библиотеки.

1
ответ дан 18 December 2019 в 13:13
поделиться

на основе ответа @ finnw ...

class MyStruct {
  float length;
  String name;
}

void send(SocketChannel dst, MyStruct ms) throws IOException {
    int len = 5 + ms.name.length();
    ByteBuffer buf = ByteBuffer.allocate(len);
    buf.putInt(len);
    buf.putFloat(ms.length);
    buf.put(ms.name.getBytes("US-ASCII"));
    buf.put((byte) 0);
    buf.flip();
    dst.write(buf);
}

На стороне C

struct mystruct *readMyStruct(int fd) {
  uint32_t size;
  read(fd, &size, sizeof size);
  struct mystruct *result = malloc(size);
  read(fd, result, size);
  return result;
}
2
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: