JavaWeb&CocosCreator使用Protobuf通信的使用和问题

  • Post author:
  • Post category:java





IDEA配置Java使用protobuf请参考


  1. proto转js命令

  2. Proto数据

  3. Java端代码以及运行效果

  4. CocosCreator端代码(TS)以及运行效果

  5. 问题以及解决办法



1.

proto文件转js文件命令



pbjs -t static-module -w commonjs -o proto.js *.proto



2.

Proto数据


syntax = "proto3";
package grace.proto.msg;
message Person {
	string id = 1;
	string name = 2;
	string email = 3;
}



3.

Java端代码


//测试protobuf数据的接口
    @PostMapping("/protobuf")
    public String getProtoBuf(@RequestParam(value = "id", defaultValue = "") String str){
        try {
//		  //数据封装
//        //获取Person对象
//        Protos.UserCache.Builder builder =  Protos.UserCache.newBuilder();
//        //通过person的内部类builder提供了构建相关属性的set方法
//        builder.setUID(1);
//        builder.setName("张三");
//        builder.setHead(1);
//        //序列化对象
//        Protos.UserCache person = builder.build();
//        System.out.print("数据大小"+person.toByteString().size()+"\n");
			//数据拆分
            System.out.print("打印传递参数111:"+str+"\n");
            byte[] bytes =  Base64.getDecoder().decode(str);
            System.out.print("数据为222:"+bytes+"\n");
            PersonMsg.Person p = null;
            try {
                p =  PersonMsg.Person.parseFrom(bytes);
                System.out.print("数据为333:"+p.getId()+"\n");
                System.out.print("数据为444:"+p.getName()+"\n");
                System.out.print("数据为555:"+p.getEmail()+"\n");
            }catch (InvalidProtocolBufferException e){
                System.out.print("异常为:"+e+"\n");
            }
            return String.valueOf(str);
        }catch (Exception e){
            return e.toString();
        }
    }

Java端打印数据:

打印传递参数111:CgExEgblvKDkuIkaDOS4jeWRiuivieS9oA==
数据为222:[B@77b050f4
数据为333:1
数据为444:张三
数据为555:不告诉你



4.

CocosCreator端代码(TS)


onLoad() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      // console.log("aaa结束了", xhr.responseText);
      //获取到后台传递过来的protobuf字符串
      // var nnnn = xhr.responseText;
    };
    let protobuf = require("protobuf");
    let protores = require("proto");
    var msgType = protores.grace.proto.msg.Person;
    //封装数据
    var d = { id: "1", name: "张三", email: "不告诉你" };
    var msg = msgType.create(d);
    var bytes = msgType.encode(msg).finish();
    cc.log("msg: ", msg);
    cc.log("bytes: ", bytes);
    //封装
    var b64 = protobuf.util.base64.encode(bytes, 0, bytes.length);
    cc.log("b64: ", b64);
    拆分数据
    // var msg = msgType.decode(b64);
    // var data = msgType.toObject(msg, {
    //   longs: Number, //long默认转换为Number类型
    //   enums: String,
    //   bytes: String
    //   // see ConversionOptions
    // });
    // cc.log("data: ", data);
    xhr.open("POST", "http://127.0.0.1:8888/test/protobuf?id=" + b64, true);
    xhr.send();
    console.log("======================");
  }

CocosCreator打印数据:

在这里插入图片描述



5.

问题以及解决办法


  • 问题1:Java端解析异常InvalidProtocolBufferException

    – 例子中涉及的编码格式分为:Base64网络传输码CgExEgblvKDkuIkaDOS4jeWRiuivieS9oA==、Cocos端Uint8Array编码[10,1,49,…]、Java端byte数组:[B@77b050f4。

    – 其中后台需要在byte[]中和Base64编码中转换、前端需要在Uint8Array和Base64进行转换。具体代码例子中有。
  • 问题2: Cocos端转码问题

尝试了很多代码,只有这个转的可用,其他不适报错就不变


var b64 = protobuf.util.base64.encode(bytes, 0, bytes.length);



版权声明:本文为yangshuaionline原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。