Как отправить объект Protocol Buffer с помощью Winsock2? - PullRequest
2 голосов
/ 06 августа 2011

Я создаю приложение клиент-сервер, используя простой сокет для передачи объектов Protocol Buffer между C ++ и Java.Я создал его на стороне Java как в качестве клиента, так и в качестве получателя.Я даже получил Java для отправки в C ++, но у меня проблемы с отправкой из C ++ в Java.Не уверен, как это написать.Сначала я отправляю размер, а затем читаю прототип.

Я использую Visual Studio C ++ 2008. DataGram и Bookmartlet - мои прототипы.

Вот мой клиент C ++ Sender

int loopt = 99;

do {
    DataGram dataGram;
    dataGram.set_state("ACK");

    time ( &rawtime );
    dataGram.set_status(ctime(&rawtime));
    Bookmarklet* bookmarklet = dataGram.mutable_bookmarklet();
    bookmarklet->set_name("TEST");
    bookmarklet->set_utl("TEST");
    dataGram.SerializeToArray(recvbuf,recvbuflen);
    dataGram.ByteSize();
    //Trouble SPOT  
    send(ConnectSocket,size,1,0);
    send(ConnectSocket,recvbuf,recvbuflen,0);
} while (loopt > 0);

Это то, что я пытаюсь воспроизвести с Java.

    OutputStream output = socket.getOutputStream();
    try {
        int testtimes = 99;
        while (socket.isConnected() && testtimes > 0) {
            Thread.sleep(1000); // do nothing for 1000 miliseconds (1
                                // second)
            DataGram dataGram = null;
            Bookmarklet bookmarklet = Bookmarklet.newBuilder()
                    .setName("TEST").setUtl("TEST").build();
            if (testtimes % 2 == 0) {
                dataGram = DataGram.newBuilder().setState("ACK")
                        .setBookmarklet(bookmarklet)
                        .setStatus(new Date().toGMTString()).build();
            } else {
                dataGram = DataGram.newBuilder().setState("ACK")
                        .setStatus(new Date().toGMTString()).build();
            }
            output.write(dataGram.getSerializedSize());
            output.write(dataGram.toByteArray());
            testtimes--;

        }
    } catch (Exception e) {

        e.printStackTrace();
    }

Любая помощь будет великолепной.Спасибо.

Клиент на Java для справки:

        InputStream input = socket.getInputStream();
        int count = input.read();
        int counter = 0;
        while (count > 0) {

            byte[] buffer = new byte[count];

            count = input.read(buffer);
            DataGram dataGram = DataGram.parseFrom(buffer);

            Bookmarklet bookmarklet = null;
            if ((bookmarklet = dataGram.getBookmarklet()) != null) {
                System.out.println(bookmarklet.toString());
            }
            System.out.println(dataGram.getState() + " "
                    + dataGram.getStatus());
            count = input.read();
            System.out.println(++counter);

        }
...