项目实训--Unity多人游戏开发(三、服务端及C#socket通信解决粘包机制)

本文详细介绍了如何在TCP服务端处理粘包问题,使用Protocol Buffers进行信息封装,确保信息的准确传输。服务端通过接收消息长度来拆分包,并通过反射机制处理请求。关键代码展示了如何创建缓冲区、解析包头和处理信息。项目涵盖了登录注册、公告推送、战绩存储和排行榜查询等功能。

本期问题

此项目通信方面:
Socket采用TCP模式面向连接传输。
粘包机制:若持续有发送的内容,则会延迟发送本次信息,等待下一次的信息一起发送。信息粘结。从而导致无法把多个信息区分开。

想法

封装每次信息,包头包含信息长度。
接收方获取信息长度,如果收到的消息长度已经满足了此信息长度则从缓存区截取出对应长度的信息并去处理请求。
被截断后剩余的信息继续等待并重复这个操作。

服务端

服务端代码结构:

在这里插入图片描述
Server类为服务器开启Socket服务。
Client类为客户端实例对象。
Message类为与客户端通信的类,解决TCP粘包机制与信息收发。
ControllerManager通过收到的消息,跳转到对应的Controller,通过反射机制,找到对应的方法应答socket信息。
具体的Controller:调用对应的Dao与数据库进行数据交换。原路返回结果直到发送回客户端。

服务端功能:

登录、注册。(略)
公告:
玩家以排位模式连接到socket服务端后,自动发送公告,前端显示在UI上。
战绩存储:
对局结束后自动发送战绩到服务端。
排行榜查询:
Unity端可以查询各个游戏的排行榜(全服前5)。

粘包机制关键代码

        private byte[] buffer = new byte[1024];//缓冲区

        private int startindex;//buffer存到了第几位,用于解决粘包问题

//收到消息处理
//至于为什么有4,见下面那个封装方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值