一个可屏蔽长短链接的网络模块

前言

游戏开发中最复杂的模块,没有之一。其实我也不想写这篇文章,怎奈框架代码卖出去了,得给我的用户一个交代。 网络模块都需要实现哪些功能呢?按我以往的开发经验总结如下:

  1. 消息的正常发送与接收

  2. 长链接的断线重连

  3. 消息发送失败与尝试

  4. 长链接的心跳处理

  5. 适应各种服务器定义的协议格式

  6. 适应各种数据传输格式

  7. 屏蔽长短链接的差异

  8. 长链接支持发送协议号与接收协议号不同的情况。

  9. 让短链接也可以像长链接一样更新数据。

    有必要屏蔽长短链接吗?

    这个看需求吧 有没有开发过程中将长链接改成短链接的情况呢?你客户端不支持,服务器可是支持的。 如果一个团队有很多开发人员,作为主程的你是否要屏蔽底层逻辑,提供统一的调用接口给其他开发人员使用呢? 如果你一个人做一款游戏,你就随便来吧,随便什么样的方式只要你开心就好。

    类图

    image.png

  10. Service 实现ServiceInterface接口负责屏蔽链接类型

  11. Message 负责封装发送和接收的消息。

  12. MessageHander 负责编解码处理。

  13. ServiceInfo 保存服务器信息。例如 ip 端口,协议号映射等信息。

  14. RemoteProxy 负责调用Service发送消息,接收Service返回的消息并通过事件派发给监听者。

    关键代码

  15. ServiceInfo image.png

  16. ServiceInterface image.png

  17. Service image.png

  18. MessageHandler image.png

  19. Message image.png

  20. RemoteProxy image.png

如何使用呢?

  1. 定义一个类来处理链接的监听 image.png

  2. 定义一个地址和开发环境相关的数据类 image.png

  3. 实现编解码处理类 image.png

  4. 定义协议号常量类 image.png

  5. 定义一个链接 image.png

  6. 使用方式

    export default class LoginController extends LogicController {
    
     constructor(){
         super(LoginProxy.instance());
     }
    
     private static ins:LoginController;
    
     static instance():LoginController{
         if(!this.ins){
             this.ins = new LoginController();
         }
         return this.ins;
     }
    
     //注册协议号与回调函数
     getProtoList(){
         return [
             [NetConfig.OPEN,this.netOpen],
             [LoginProtocolIDs.LOGIN,this.loginRsp],
         ];
     }
    
     netOpen(){
         cc.log(' 链接成功 ')
         this.pushView('Prefab/LoginView','LoginView',null,ModuleManager.getLoader(),UIIndex.STACK)
     }
     //进入模块 先链接服务 当然也可以先弹出界面,再推送链接结果。
     intoLayer(){
         ModuleManager.setModuleID(ModuleID.LOGIN)
         //进入此模块,先进行链接操作,如果链接成功 会走loginRsp 函数
         this.remoteProxy.connect(new ServiceInfo(NetConfig.HTTP,AddressConfig.getAdress(AddressConfig.LOGIN,0)));
     }
    
     // 点击登陆按钮发送请求。
     loginReq(name:string){
         cc.log(" loginReq ",name);
         this.sendMessage(LoginProtocolIDs.LOGIN,{name:name,channel:'crazy'});
     }
    
     //登陆成功
     loginRsp(msg:ReceiveMessage){
         cc.log(" loginRsp msg ",msg);
         //由于服务器已经关闭,所以不会被调用,正常内容返回时会走这里。
     }
    

}

```

结语

细节代码太多了,如果都粘贴上来无法忍受。其实网络那些事论坛里已经有人说的很详细了。使用方式也很多,就好像都是用xxgl,每个引擎实现的方式都不同。我只是从框架和封装的角度整理一下具体的使用方式,其实细节的东西,你没有遇到的时候也是没办法理解的,代码里都是经验。有想法的同学留言吧。

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

微信图片_20190904220029.jpg

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值