加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

尝试在java中使用protobuf发送和接收消息,但收到错误:协议消息

发布时间:2020-12-14 19:23:26 所属栏目:Java 来源:网络整理
导读:问题发生在服务器端,parseDelimitedFrom()调用. 客户端: C2SGainCard.Builder s = C2SGainCard.newBuilder(); C2SGainCard c2s = s.build(); GameRequest.Builder reqBuilder=GameRequest.newBuilder(); reqBuilder.setBody(c2s.toByteString()); reqBuilde

问题发生在服务器端,parseDelimitedFrom()调用.

客户端:

    C2SGainCard.Builder s = C2SGainCard.newBuilder();
    C2SGainCard c2s = s.build();

    GameRequest.Builder  reqBuilder=GameRequest.newBuilder();
    reqBuilder.setBody(c2s.toByteString());
    reqBuilder.setName(C2SGainCard.class.getSimpleName());
    reqBuilder.setPlayerId("3");
    GameRequest request=reqBuilder.build();

    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    os.write(request.toByteArray());
    os.flush();
    os.close();
    socket.close();

服务器端:

    try{
        DataInputStream is = new DataInputStream(socket.getInputStream());
        GameRequest gameRequest = GameRequest.parseDelimitedFrom(is);
    }catch(Exception ex){
        System.out.println(ex.getMessage());
    }

这是另一个类似的问题:

客户端:

    C2SSell.Builder s = C2SSell.newBuilder();
    CardOnSell.Builder cardOnSell = CardOnSell.newBuilder();
    cardOnSell.setId(1);
    cardOnSell.setPlayerId(3);
    cardOnSell.setCardId(1);
    cardOnSell.setCurrentPrice(111);
    cardOnSell.setFixedPrice(555);
    cardOnSell.setDescription("cao");

    s.setCardOnSell(cardOnSell.build());

    C2SSell c2s = s.build(); 

套接字处理是一样的.

服务器端:

    DataInputStream is = new DataInputStream(socket.getInputStream());
    byte[] b = new byte[1024];
    int len=is.read(b);
    String as = new String(b,len);
    GameRequest gameRequest=GameRequest.parseFrom(as.getBytes());

事实证明服务器端将在parseFrom()再次调用时中断.但是当我评论两行时:

cardOnSell.setCurrentPrice(111);
cardOnSell.setFixedPrice(555);

在客户端上,parseFrom()调用刚刚工作没有问题.在frist我怀疑.proto文件有一些问题,并且已经证明那里没有问题……那么这个问题是怎么来的?那是因为我在parseFrom()调用之前错过了一些数据?

最佳答案
我不记得究竟是什么格式parseDelimitedFrom,但我怀疑你只是想在服务器端使用parseFrom.

目前尚不清楚为什么要使用os.write(request.toByteArray()),或者为什么要创建DataOutputStream.您应该只能使用OutputStream和InputStream,编写:

request.writeTo(socket.getOutputStream());

然后:

GameRequest gameRequest = GameRequest.parseFrom(socket.getInputStream());

如果您确实需要分隔版本,则需要使用writeDelimitedTo.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读