Отправка структуры через Socket с использованием JAVA и C ++ - PullRequest
4 голосов
/ 04 февраля 2010

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

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

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

Ответы [ 5 ]

9 голосов
/ 04 февраля 2010

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

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

2 голосов
/ 05 февраля 2010

на основании ответа @ 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 голосов
/ 04 февраля 2010

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

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

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

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

1 голос
/ 04 февраля 2010

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

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

0 голосов
/ 04 февраля 2010

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

...