Egret官方提供了一个Websocket的库,可以让我们方便的和服务器长连接交互。

标题写的时候自定义websocket的协议格式。解释一下,不是说我们去动websocket本身的东西,我们是在websocket的传输内容里面约定一套服务器和客户的交互格式。

捋一下思路:

  1. 选择序列化的方式
  2. 约定一个交互格式
  3. 封装一个简单的NetMgr(网络管理类)

选择序列化方式:

目前主流的序列化方式一般就三种 xml json protobuf,经过考虑,我决定选择json,原因是:1.对复杂的格式支持比protobuf好。2.比xml更节约流量。3.因为选择的时候TypeScript,所以json序列化更方便,我看egret论坛有反应protobuf在微信小程序中有问题。所以综合一下,就选择json吧。

约定一个交互格式:

格式就三个字段:1.cmd :命令 2. data 数据 3. CmdType:命令类型

class Protocol<T> {

    public cmd: string;

    public data: T;

    public cmdType: CMDTYPE;

}
enum CMDTYPE {
RECHARGE,
NET,
OTHER
}

封装一个简单的NetMgr:

封装NetMgr这个类主要是想把游戏逻辑和基础的网络操作部分屏蔽,通过Egret的事件机制来传递网络数据到界面层。发送数据给服务器,也只操作NetMgr。不会直接接触websocket。

简单的事件类封装

class NetEvent extends egret.Event {

    public cmd: string = "NetEvent";
public data: any;
public constructor(type: string, bubbles: boolean = false, cancelable: boolean = false) {
super(type, bubbles, cancelable);
}
}

NetMgr类

// TypeScript file
/**
* 网络管理类
*/
class NetMgr extends egret.DisplayObject { private socket: egret.WebSocket = new egret.WebSocket();
static net: NetMgr; constructor() {
super(); }
public static GetInstance(): NetMgr {
if (this.net == null)
this.net = new NetMgr();
return this.net;
} public StartSocket(serverip: string, port: number): void {
if (this.socket.connected) return;
this.socket.addEventListener(egret.ProgressEvent.SOCKET_DATA, this.onReceiveMessage, this);
this.socket.addEventListener(egret.Event.CONNECT, this.onSocketOpen, this);
this.socket.addEventListener(egret.IOErrorEvent.IO_ERROR, this.IOError, this);
this.socket.addEventListener(egret.Event.CLOSE, this.Close, this);
this.socket.connect(serverip, port) } public GetStatus(): boolean {
return this.socket.connected;
} onReceiveMessage(): void {
console.log("接收到消息:");
var msg = this.socket.readUTF();
console.log(msg); let protocol: Protocol<any> = JSON.parse(msg);
// if (protocol.cmd) {
try {
let event = new NetEvent(NetEvent.Net);
event.cmd = protocol.cmd;
event.data = protocol;
this.dispatchEvent(event)
} catch (error) {
console.error("网络事件:" + protocol.cmd + "-处理错误")
}
} Close(): void {
console.log("连接关闭") } onSocketOpen(): void { console.log("网络连接成功"); } IOError(): void { console.log("网络连接断开") } public Emit<T>(cmd: string, data: T): void {
if (this.socket.connected) {
let protocol = new Protocol<T>();
protocol.cmd = cmd;
protocol.data = data;
this.socket.writeUTF(JSON.stringify(protocol));
} } }

简单的网络操作和序列化就这样了,后面还有断网重连之类的,就后面再优化。(我一般做东西都是先实现,再优化)

如何使用呢??

1.接收服务器的数据

NetMgr.GetInstance().addEventListener(NetEvent.Net, (e: NetEvent) => {
console.log("接受到网络派发的事件" + e.data) }, this)

2.给服务器发送数据

    let demo = new TestDemo();
demo.Data = "wocao";
NetMgr.GetInstance().Emit<TestDemo>("serverAction", demo);

好了,这块内容就到这里了

需要持续关注的大佬,可以考虑一下进我们的QQ群:753357671


网络游戏开发-客户端2(自定义websocket协议格式)的更多相关文章

  1. 网络游戏开发-客户端4 关于Egret的本地坐标和舞台坐标

    因为最近公司事情比较多,所以没怎么更新博客. 不过咱们这个游戏还是在继续往下写. 今天晚上打算写斗地主的出牌动画,遇到一个问题,就是关于本地坐标和舞台坐标的计算问题 在Egret官网的解释是:x 和 ...

  2. 网络游戏开发-客户端1(开始Hello world)

    打开Egret Launcher ,新建一个EUI项目,起名为 EQiPai 这里需要勾选的是socket网络库,game游戏库.如果要面向海外用户的话,建议勾上Facebook的小游戏sdk. 然后 ...

  3. WebSocket协议入门介绍

    目录 目录 WebSocket协议是什么 WebSocket是应用层协议 WebSocket与Http的区别 为什么要使用WebSocket 如何使用WebSocket 客户端API 在客户端使用We ...

  4. Websocket协议之php实现

    前面学习了HTML5中websocket的握手协议.打开和关闭连接等基础内容,最近用php实现了与浏览器websocket的双向通信.在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问 ...

  5. WebSocket协议理解-数据包格式解析

    WebSocket 的诞生 做客户端开发时,接触最多的应用层网络协议,就是 HTTP 协议,而今天介绍的 WebSocket,下层和 HTTP 一样也是基于 TCP 协议,这是一种轻量级网络通信协议, ...

  6. WebSocket协议开发

    一直以来,网络在很大程度上都是围绕着HTTP的请求/响应模式而构建的.客户端加载一个网页,然后直到用户点击下一页之前,什么都不会发生.在2005年左右,Ajax开始让网络变得更加动态了.但所有的HTT ...

  7. netty(4)高级篇-Websocket协议开发

    一.HTTP协议的弊端 将HTTP协议的主要弊端总结如下: (1) 半双工协议:可以在客户端和服务端2个方向上传输,但是不能同时传输.同一时刻,只能在一个方向上传输. (2) HTTP消息冗长:相比于 ...

  8. 开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析

    很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...

  9. dotnet core 开发无缝兼容Http和Websocket协议的接口服务

    在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...

随机推荐

  1. Fiddler 手机爬虫

    Fiddler抓包工具 配置Fiddler 添加证书信任,Tools - Options - HTTPS,勾选 Decrypt Https Traffic 后弹出窗口,一路确认 ...from bro ...

  2. Java面试-List中的sort详细解读

    最近看了一些排序相关的文章,因此比较好奇,Java中的排序是如何做的.本片文章介绍的是JDK1.8,List中的sort方法. 先来看看List中的sort是怎么写的: @SuppressWarnin ...

  3. Python入门基础:七段数码管绘制

    1.在学习Python的过程中,运用所学的一些基础知识,进行一些简单的编程,可以收获很多乐趣.在生活中,LED灯无处不在,荧幕显示的广告词,给我们呈现出动态的视觉效果.下面,则以最简单的显示日期为例, ...

  4. 洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)

    题目链接:https://www.luogu.org/problemnew/show/P1525 题目分析 通过分析,我们可以知道,这道题的抽象意义就是把一个带边权的无向图,分成两个点集,使得两个集合 ...

  5. HTML5有哪些新特性,移除了哪些元素?如何处理HTML5新标签的浏览器兼容性问题?如何区分HTML和HTML5?

    HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加. 绘画canvas: 用于媒介回放的video和audio元素: 本地离线存储localStorage长期存储数据 ...

  6. js 事件委托获取子元素下标

    html:部分 <ul> <li>第一个</li> <li>第二个</li> <li>第三个</li> <li ...

  7. Spring+Mybatis整合的练手小项目(一)项目部署

    声明:教程是网上找的,代码是自己敲的 项目目录大致如下: 1. 首先创建Maven工程,在pom.xml中加入项目所需依赖: <?xml version="1.0" enco ...

  8. charles 镜像工具

    本文参考:charles 镜像工具 镜像工具会在你浏览指定网站时,把抓取到的文件克隆一份,并保存在你指定的路径下: 注意:如果你配置是www.aaa.com; 那么只会抓这个域名下的文件,这个域名如果 ...

  9. 《Java7并发编程实战手册》读书笔记

    一.线程管理 1.线程的创建和运行 创建线程的2种方式: 继承Thread类,并覆盖run()方法 创建一个实现Runnable接口的类.使用带参数的Thread构造器来创建Thread对象 每个Ja ...

  10. [Pandas] 05 - Parallel processing

    相关资源 [Python] 09 - Multi-processing [Pandas] 01 - A guy based on NumPy [AI] 深度数学 - Bayes 这章非常有意思,但一定 ...