Как я могу передать двойной или любой другой случайный тип из Java в C ++ через сокет? - PullRequest
2 голосов
/ 08 февраля 2012

Я разрабатываю клиент-серверное приложение, где сервер - C ++, а клиент - Java.

Для связи с ними я использую сокеты.Теперь я могу успешно передавать строки через сокет следующим образом:

На стороне клиента:

public void serializeAndSendMessage(String msg) {
    try {
        os.write( msg.getBytes() );
        os.flush();
    }
    catch ( Exception e ) {
        e.printStackTrace();
    }
}

На стороне сервера:

char recvbuf[DEFAULT_BUFLEN];
int iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) {
        printf("Bytes received: %d\n", iResult);
        recvbuf[iResult] = 0; //set the end of the msg

Как передать другие данные,как Double или Int?Возможно ли получить Double в строку, а затем преобразовать его обратно на сервере C ++ из char в Double?

Thanx.

Ответы [ 2 ]

9 голосов
/ 08 февраля 2012

Вы действительно хотите что-то вроде Google ProtocolBuffers , которое заботится о сериализации и десериализации of произвольные структуры данных кросс-платформенные и кросс-языковые .

Существуют другие библиотеки, предоставляющие альтернативу ProtoBuf, такие как Apache thrift (и некоторые из них добавляют сети, которых ProtoBuf отсутствует). Тем не менее, ProtoBuf является хорошим выбором, поскольку он зрелый, используется самими Google и имеет Java и C ++ в качестве основных языков с поддержкой первого уровня.

1 голос
/ 08 февраля 2012

На стороне Java сделайте что-то вроде этого, чтобы получить ваши байты:

public static byte[] toByteArray(double value) {
    byte[] bytes = new byte[8];
    ByteBuffer.wrap(bytes).putDouble(value);
    return bytes;
}

...

os.write(toByteArray(1.234));
os.flush()

Затем, на стороне C ++, вы можете получить его обратно так:

double received;
memcpy(&received, recvbuf, sizeof(double))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...