cocos creator主程入门教程(四)—— 网络通信
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑。本系列文章以TypeScript为介绍语言。
前面已经介绍怎样加载资源、管理弹窗。开发一个网络游戏,难免要处理网络通信。有几点问题需要注意:
1.服务端为了快速开发可能前期使用http通信,后面再改成websocket/socket。
2.同时存在http和websocket/socket通信
3.通信数据格式可能需要随时替换为json或protocol buffer,可能需要添加额外头部。
4.在新手引导里使用本地数据做模拟,请求不需要发送给后端。
5.重连后数据简单同步
针对第一、二个问题,我在设计通信模块时会考虑将通信尽量抽象为统一的对外接口,在游戏启动时通过不同的驱动器创建实例(如果只使用一种通信方式,使用单一实例)。
public constructor(driver: ConnectDriver) {
this._driver = driver;
}
先定义通用的网络通信数据结构。其中请求分为数据和控制两种类型,用于区分心跳、登录、重连
/**
* 请求类型
*/
export enum RequestType {
DATA = 1,
CTRL
} /**
* 网络通信数据结构
*/
export interface NetData {
seq?: number; // 序列号
mod: number; // 模块
cmd: number; // 命令
path?: string; // 路径
data?: any; // 数据
tmpData?: any; // 数据处理器临时数据
status?: number; //状态码
type?: RequestType; //请求类型
}
然后定义通用的对外接口
public open(url: string, port: number, isBinary: boolean, timeout: number, retryCount: number, params: any, cb: (succ: boolean) => void): void {}
public close(): number {}
public reopen(cb: (succ: boolean) => void): void {}
public sendData(data: NetData, params: HttpReq | any, succCb: (data: NetData) => void, failedCb: (code: number, reason: string) => void): void {}
public resendNotRecv(): void {}
其中resendNotRecv用于重连后发送没有收到响应的包,后端根据序列号决定是否处理。
这里没有对推送的处理,实际上推送是接收到服务端数据后,调用广播给监听者。下面定义监听者
/**
* 网络连接事件监听接口
*/
export interface ConnectEventListener {
onOpen(driver: ConnectDriver);
onClosed(driver: ConnectDriver);
onError(driver: ConnectDriver, msg: string);
onSendStart(driver: ConnectDriver);
onRecvEnd(driver: ConnectDriver);
} /**
* 网络事件监听接口
*/
export interface NetEventListener extends ConnectEventListener {
onPush(driver: ConnectDriver, data: NetData): void;
}
对外提供注册和移除接口
public addEventListener(listener: NetEventListener): void {}
public removeEventListener(listener: NetEventListener): void {}
针对第三个问题,需要定义一些预处理器,在发送数据前和接收到数据后,做拦截预处理。
/**
* 网络通信数据处理器接口
*/
export interface NetDataProcessor {
processReqData(data: any): any;
processRespData(data: any): any;
}
对外提供添加和移除接口,这样就可以灵活定义通信数据格式
public addDataProcessor(processor: NetDataProcessor): void {}
public removeDataProcessor(processor: NetDataProcessor): void {}
针对第四个问题,同样是增加一个特殊的拦截器,在请求发送前对其处理,如果拦截器能处理,就不再发送给后端。
/**
* 模拟服务器接口
*/
export interface SimServer {
handleRequest(data: NetData): NetData;
}
对外提供设置接口
public setSimServer(server: SimServer): void {}
针对第五个问题,所有数据请求都有序列号,对请求进行记录,没有响应的请求包放到一个队列里,重连后重发这些包给后端处理。
public resendNotRecv(): void {}
网络通信先说到这里,下一篇我们将介绍下怎样设计日志系统。
cocos creator主程入门教程(四)—— 网络通信的更多相关文章
- cocos creator主程入门教程(七)—— MVC架构
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇将介绍在游戏客户端常用的架构MVC架构.一个游戏的MVC如下划分: M:1)单例全局的数据中心Wo ...
- cocos creator主程入门教程(一)—— 初识creator
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 我们在cocos creator新建一个Hello TypeScript项目,都会有一个assets/S ...
- cocos creator主程入门教程(三)—— 资源管理
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 在初识篇,我介绍过怎样加载prefab.cocos提供了一系列的加载接口,包括cc.loader.loa ...
- cocos creator主程入门教程(二)—— 弹窗管理
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 我们已经知道怎样制作.加载.显示界面.但cocos没有提供一个弹窗管理模块,对于一个多人合作的项目,没有 ...
- cocos creator主程入门教程(五)—— 日志系统
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍日志系统的设计.一般我们开发一个demo,只会简单的用cocos提供的cc.log打印下日志, ...
- cocos creator主程入门教程(十一)—— 有限状态机和行为树
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个 ...
- cocos creator主程入门教程(十)—— A*寻路
摘要: 五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍A*寻路算法.在RPG.SLG.模拟经营类游戏,有需要给角色寻路的需求,一般寻路我们采 ...
- cocos creator主程入门教程(九)—— 瓦片地图
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍瓦片地图,在开发模拟经营类游戏.SLG类游戏.RPG游戏,都会使用到瓦片地图.瓦片地图地面是通 ...
- cocos creator主程入门教程(八)—— 代码结构
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇简单介绍下代码结构,清晰的代码结构更有利于团队对项目的理解和维护. 1.前面我们介绍了一系列基础功 ...
随机推荐
- 【热身】github的使用
GitHub 可以托管各种Git版本库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个 ...
- 3d轮播图——类似酷狗的轮播
说到轮播图,其实只要是跟web开发相关的无论是前端后端应该都不陌生,各种各样的轮播图,从以前的单纯的平面山水画遮盖滑动或滚动,到Jquery的animate甚至是h5+css3,各种炫酷的轮播图更是层 ...
- python 闯关之路三(面向对象与网络编程)
1,简述socket 通信原理 如上图,socket通信建立在应用层与TCP/IP协议组通信(运输层)的中间软件抽象层,它是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/ ...
- 如何识别企业内的“千里马”?
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
- 使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket
http://blog.csdn.net/timliang18601860/article/details/7104485
- Oracle-06:DML语言数据表的操作
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 开篇放上一个SQL脚本,供测试使用 create table DEPT ( deptno ) not null ...
- SAP系统三层架构
SAP系统三层架构:表示层,应用层,数据库层 表示层:也可以说个人用户client.由表示层提出数据请求,然后应用层对请求进行处理,再通过数据库层DBMS系统对数据进行处理. 从应用服务器的缓 ...
- echarts 专题
todo:缩放 5 分钟上手 ECharts 获取 ECharts 你可以通过以下几种方式获取 ECharts. 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的 ...
- MySQL索引及查询优化总结 专题
小结:db名与应用名相同,表名:业务名_此表的作用 ,表名表示内容,不体现数量,如果表示boolean概念,表名需要使用is_业务含义来表示,但POJO中不应该出现isXXX,因为不方便序列化,中间的 ...
- Git常用命令解说
http://blog.csdn.net/hangyuanbiyesheng/article/details/6731629 1. Git概念 1.1. Git库中由三部分组成 Gi ...