美文网首页
[Unity]利用Postman搭建方便的协议调试工具

[Unity]利用Postman搭建方便的协议调试工具

作者: tmgg | 来源:发表于2021-02-19 15:39 被阅读0次

    为了解耦服务器与客户端的开发流程,决定在游戏内搭建一个httpserver用于模块协议的发送与接收
    功能

    • 获取pb结构,转成json格式输出
    • 模拟客户端发送消息给服务器
    • 模拟服务器发送消息给客户端
    • 监听服务器发送给客户端的消息,并以json的方式输出解析后的结果

    实现

    • 利用C#的反射特性,根据proto协议名得到pb消息类型
    • 利用json数据反序列化得到proto对象
    • 通过游戏内网络模块的Send接口来模拟发送消息给服务器
    • 通过游戏内网络模块的Push事件来模拟服务器发送消息给客户端
    • 在debug模式下支持注册监听的协议id,在收到服务器请求时,将pb消息序列化成json输出到Console

    使用

    • Json示例:
    {
        "protoName": "MoonClient.RpcC2G_RoleRevive",
        "protoData": {
            "type": 1,
            "roleId": 1565928
        }
    }
    
    • 流程图


      数据流转流程图.png
    • Get请求:

    Request URL: http://127.0.0.1:8008/
    HttpMethod: Get
    Headers: 
    KEY       VALUE
    protoName RpcC2G_RoleRevive
    

    参数填好后点击“Send”,HttpServer响应后会在下⾯Body中输出protoName的json结构(注意需要选择json格式显示)
    如下图所示:


    Get请求1.png
    Get请求2.png
    • Post请求:
    Request URL: http://127.0.0.1:8008/
    HttpMethod: Post 
    Body: 选择raw => JSON(application/jsoon)
    

    拷⻉Get请求中返回的json数据到body后,再次修改相关参数的数值,点击“发送”便可。
    模拟消息发送成功后会在下⾯打印相关描述,如下图所示:


    Post请求.png

    关键代码

    • pb转json
            private static string getJsonFromPB(string pbType)
            {
                Type t = Type.GetType(pbType);
                if (t == null)
                {
                    MDebug.singleton.AddErrorLogF("找不到对应类型定义:{0}", pbType);
                    return string.Empty;
                }
    
                IMessage msg = Activator.CreateInstance(t) as IMessage;
                var fields = msg.Descriptor.Fields.InFieldNumberOrder();
                StringBuilder jsonStr = new StringBuilder("{");
                string value;
                for (int i = 0; i < fields.Count; i++)
                {
                    var field = fields[i];
                    switch (field.FieldType)
                    {
                        case Google.Protobuf.Reflection.FieldType.Bool:
                            value = "true";
                            break;
                        case Google.Protobuf.Reflection.FieldType.Bytes:
                        case Google.Protobuf.Reflection.FieldType.String:
                            value = "\"\"";
                            break;
                        case Google.Protobuf.Reflection.FieldType.Group:
                            value = "\"unsupported type:Group\"";
                            break;
                        case Google.Protobuf.Reflection.FieldType.Message:
                            value = getJsonFromPB(field.MessageType.FullName);
                            break;
                        default:
                            value = "0";
                            break;
                    }
    
                    if (i > 0)
                    {
                        jsonStr.Append(",");
                    }
                    jsonStr.Append("\"").Append(field.JsonName).Append("\":");
                    if (field.IsRepeated)
                    {
                        jsonStr.Append("[");
                    }
                    jsonStr.Append(value);
                    if (field.IsRepeated)
                    {
                        jsonStr.Append("]");
                    }
                }
    
                return jsonStr.Append("}").ToString();
            }
    
    • json转pb
            Type pbType = Type.GetType(pbTypeStr);
            IMessage pbObj = Activator.CreateInstance(pbType) as IMessage;
            pbObj = pbObj.Descriptor.Parser.ParseJson(httpResult["protoData"].ToJson());
    

    相关文章

      网友评论

          本文标题:[Unity]利用Postman搭建方便的协议调试工具

          本文链接:https://www.haomeiwen.com/subject/oyzqjctx.html