分包测试

进行分包测试,同时也演示一下客户端和服务器添加新协议的流程。

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
/// <summary>
/// 分发分包测试
/// </summary>
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
/// <summary>
/// 分发分包测试
/// </summary>
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对应的传输层来决定的,我们在代码中只能按照情况解析,并不能决定发送的是分包还是粘包。