如何使用Winsock2发送Protocol Buffer对象?

发布于 2024-11-27 23:06:52 字数 2598 浏览 0 评论 0原文

我正在创建一个客户端服务器应用程序,使用一个简单的套接字在 C++ 和 Java 之间传输 Protocol Buffer 对象。我在 Java 端创建了它作为客户端和接收器。我什至将 Java 发送到 C++,但从 C++ 发送到 Java 时遇到问题。不知道怎么写。首先,我发送尺寸,然后读取原型对象。

我正在使用 Visual Studio C++ 2008。DataGram 和 Bookmartlet 是我的原型对象。

这是我的 C++ 发送方客户端

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);

        }

I am creating a client server app using a simple socket to transfer Protocol Buffer objects between C++ and Java. I have it created on the Java side both as the client and receiver. I even got the Java to send to C++ but I am having trouble with sending from C++ to Java. Not sure how to write it. First I am sending the size and then reading the proto object.

I am using Visual Studio C++ 2008. DataGram and Bookmartlet are my proto objects.

Here is my C++ Sender Client

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);

This is what I am trying to replicate from 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();
    }

Any help would be great. Thanks.

Client in Java for Reference:

        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);

        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文