当前位置:   article > 正文

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

protobuf cocos 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Java端打印数据:

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

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("======================");
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/152417
推荐阅读
相关标签
  

闽ICP备14008679号