為了解耦服務(wù)器與客戶端的開發(fā)流程诲宇,決定在游戲內(nèi)搭建一個httpserver用于模塊協(xié)議的發(fā)送與接收
功能
- 獲取pb結(jié)構(gòu)惶翻,轉(zhuǎn)成json格式輸出
- 模擬客戶端發(fā)送消息給服務(wù)器
- 模擬服務(wù)器發(fā)送消息給客戶端
- 監(jiān)聽服務(wù)器發(fā)送給客戶端的消息,并以json的方式輸出解析后的結(jié)果
實現(xiàn)
- 利用C#的反射特性纺荧,根據(jù)proto協(xié)議名得到pb消息類型
- 利用json數(shù)據(jù)反序列化得到proto對象
- 通過游戲內(nèi)網(wǎng)絡(luò)模塊的Send接口來模擬發(fā)送消息給服務(wù)器
- 通過游戲內(nèi)網(wǎng)絡(luò)模塊的Push事件來模擬服務(wù)器發(fā)送消息給客戶端
- 在debug模式下支持注冊監(jiān)聽的協(xié)議id宙暇,在收到服務(wù)器請求時,將pb消息序列化成json輸出到Console
使用
- Json示例:
{
"protoName": "MoonClient.RpcC2G_RoleRevive",
"protoData": {
"type": 1,
"roleId": 1565928
}
}
-
流程圖
數(shù)據(jù)流轉(zhuǎn)流程圖.png Get請求:
Request URL: http://127.0.0.1:8008/
HttpMethod: Get
Headers:
KEY VALUE
protoName RpcC2G_RoleRevive
參數(shù)填好后點擊“Send”,HttpServer響應(yīng)后會在下?Body中輸出protoName的json結(jié)構(gòu)(注意需要選擇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數(shù)據(jù)到body后蜻拨,再次修改相關(guān)參數(shù)的數(shù)值缎讼,點擊“發(fā)送”便可坑匠。
模擬消息發(fā)送成功后會在下?打印相關(guān)描述,如下圖所示:
Post請求.png
關(guān)鍵代碼
- pb轉(zhuǎn)json
private static string getJsonFromPB(string pbType)
{
Type t = Type.GetType(pbType);
if (t == null)
{
MDebug.singleton.AddErrorLogF("找不到對應(yīng)類型定義:{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轉(zhuǎn)pb
Type pbType = Type.GetType(pbTypeStr);
IMessage pbObj = Activator.CreateInstance(pbType) as IMessage;
pbObj = pbObj.Descriptor.Parser.ParseJson(httpResult["protoData"].ToJson());