本期问题
此项目通信方面:
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,见下面那个封装方法

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

被折叠的 条评论
为什么被折叠?



