У меня есть сокет, где сервер находится в JAVA, но Клиент находится в C++.
Struct{
float length;
char[] name;
}myStruct;
Как я могу преобразовать структуры в поток байтов, отправленный Сервером, и могу быть правильно проанализирован Клиентом? Любой пример кода помог бы! (Я слышал, что XML является опцией, но я не знаком с ним), Спасибо.
Попробуйте использовать протокол Google буферы , размещенные на странице ProtocolBuffers в Google Code. Небольшой, эффективный, поддержка Python, Java и C ++. Похоже, это хорошо соответствует вашим потребностям.
Меньше накладных расходов, чем подход XML, и лучше, чем накатать собственный - это сложнее, чем вы думаете.
Рассмотрите JSON для простоты (что-то вроде JSONRPC, или просто создайте собственный JSON)
для Thrift для сложности
XML не делает "Магия"
.
можно использовать XML или простой текст
.
думать о том, что бы ты делал, работая с файлами.
вы бы использовали jave для записи данных в файл
.
тогда вы можете использовать c++ для чтения этого файла.
то же самое с сокетом
.
XML не является особенным. Простой текст может выполнять работу
.
XML только добавляет структуру
я бы не предложил реализовать сериализацию самостоятельно для тяжелых задач
вы можете рассмотреть возможность использования JNI/JNA лучший способ - это использовать корбу, но это может быть перебор
.Использовать JSONRPC http://www.json.org/
Очень легко сгенерировать, очень легко проанализировать. На главной странице есть готовые библиотеки.
на основе ответа @ 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;
}