分包测试
进行分包测试,同时也演示一下客户端和服务器添加新协议的流程。
MsgTest协议
新的协议命名为MsgTest
,首先在ProtocolEnum
里面声明
1 2 3 4 5 6 7 8
| public enum ProtocolEnum { None = 0, MsgSecret = 1, MsgPing = 2,
MsgTest = 9999, }
|
然后再在SysMsg
里面添加MsgTest
协议具体内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [ProtoBuf.ProtoContract()] public class MsgTest : MsgBase { public MsgTest() { ProtoType = ProtocolEnum.MsgTest; } [ProtoBuf.ProtoMember(1)] public override ProtocolEnum ProtoType { get; set; } [ProtoBuf.ProtoMember(2)] public string ReqContent { get;set; } [ProtoBuf.ProtoMember(3)] public string RspContent { get;set; }
}
|
上面这两个在服务器和客户端中都要添加好。(服务器的string属性需要加问号声明为可空的)
客户端
客户端添加发送协议的逻辑,在ProtocolManager
中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static void SocketTest() { MsgTest msg = new MsgTest(); msg.ReqContent = "怀进鹏指出,习近平总书记高度重视推广普通话工作,在党的二十大报告中明确指出要加大国家通用语言文字推广力度," + "并作出一系列重要指示批示,强调要推广国家通用语言文字,逐步提高群众使用国家通用语言文字的意识和能力;坚定推行国家通用语言文字教育教学," + "努力培养爱党爱国的社会主义事业建设者和接班人。我们要认真领会落实好习近平总书记重要指示精神,切实把推普工作放在党和国家事业发展的大格局中去思考、" + "去谋划、去推进。要主动融入中国式现代化建设大局,为推进中国式现代化建设提供重要的人才和智力支撑;要不断加大国家通用语言文字推广力度,全面服务铸牢中华" + "民族共同体意识;要大力建设中华民族现代文明,助力增强中华民族的巨大向心力和中华文明的持久影响力。"; NetManager.Instance.AddProtoListener(ProtocolEnum.MsgTest, (msg) => { Debug.Log("分包测试回调" + ((MsgTest)msg).RspContent); }); NetManager.Instance.SendMessage(msg); }
|
在NetTest
中添加
1 2 3 4 5 6 7 8
| void Update() { NetManager.Instance.Update(); if (Input.GetKeyDown(KeyCode.K)) { ProtocolManager.SocketTest(); } }
|
服务端
服务端在MsgHandler
添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public static void MsgTest(ClientSocket client, MsgBase msg) { MsgTest msgTest = (MsgTest)msg; if(msgTest.ReqContent != null) Debug.Log(msgTest.ReqContent); msgTest.ReqContent = null; msgTest.RspContent = "服务器发送的数据:怀进鹏就做好推普工作提出要求。一要注重提质增效,抓好学校推普这个主阵地,持续实施学前儿童普通话教育专项计划," + "持续提高大中小学生听说读写能力,加大教师普通话教育和培训力度;抓好社会推普这个基础阵地,结合人民生产生活实际需求开展“职业技能+普通话”培训;充分发" + "挥语言文字以文化人、以文育人独特作用,加强对中华优秀语言文化的挖掘和阐发,为中华民族伟大复兴注入不竭精神动力。二要注重数字赋能,加强语言文字高质量" + "数字资源建设和常态化应用,积极探索各地区有效应用方式,满足人民群众日益增长的语言、文化、教育需求。三要注重统筹协同,认真履行宪法赋予的推普责任,全" + "面落实党委领导、政府主导、语委统筹、部门支持、社会参与的管理机制,形成全社会共同参与推普的浓厚氛围。"; ServerSocket.Send(client,msgTest); }
|
接下来在服务端或客户端的接收回调函数里打断点进行调试,就能看到处理分包时ByteArray
进行扩充的效果。
粘包测试
客户端
修改前面的ProtocolManager.SocketTest
1 2 3 4 5 6 7 8 9 10
| public static void SocketTest() { MsgTest msg = new MsgTest(); msg.ReqContent = "ATAO"; NetManager.Instance.AddProtoListener(ProtocolEnum.MsgTest, (msg) => { Debug.Log("分包测试回调" + ((MsgTest)msg).RspContent); }); NetManager.Instance.SendMessage(msg); }
|
再修改NetTest
1 2 3 4 5 6 7 8 9 10 11
| void Update() { NetManager.Instance.Update(); if (Input.GetKeyDown(KeyCode.K)) { ProtocolManager.SocketTest(); ProtocolManager.SocketTest(); ProtocolManager.SocketTest(); ProtocolManager.SocketTest(); } }
|
服务端
修改前面的MsgHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public static void MsgTest(ClientSocket client, MsgBase msg) { MsgTest msgTest = (MsgTest)msg; if(msgTest.ReqContent != null) Debug.Log(msgTest.ReqContent); msgTest.ReqContent = null; msgTest.RspContent = "Get!"; ServerSocket.Send(client,msgTest); ServerSocket.Send(client,msgTest); ServerSocket.Send(client,msgTest); ServerSocket.Send(client,msgTest); ServerSocket.Send(client,msgTest); }
|
接下来在服务端或客户端的接收回调函数里打断点进行调试,就能看到处理粘包时递归读取。
注意
分包和粘包是C#底层封装的Socket API对应的传输层来决定的,我们在代码中只能按照情况解析,并不能决定发送的是分包还是粘包。