网络游戏开发-客户端2(自定义websocket协议格式)

简介: 网络游戏开发-客户端2(自定义websocket协议格式)

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);

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

目录
相关文章
|
27天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
102 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
4天前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
鸿蒙开发:切换至基于rcp的网络请求
|
1月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
131 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
24天前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
|
1月前
|
Docker 容器
docker中创建自定义网络
【10月更文挑战第7天】
25 6
|
1月前
|
安全 NoSQL Redis
Docker自定义网络
Docker自定义网络
|
1月前
|
监控 小程序 前端开发
小程序全栈开发中的WebSocket实时通信实践
【10月更文挑战第3天】随着移动互联网的发展,小程序因便捷的用户体验和社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的WebSocket实时通信实践,包括其实时通信、长连接及双向通信的特点,并通过实时聊天、推送、游戏和监控等功能的实现,展示了WebSocket在小程序中的应用。开发者需注意安全性、性能及兼容性等问题,以保障小程序的稳定运行和用户体验。
44 7
|
1月前
|
Docker 容器
docker中自定义网络
【10月更文挑战第5天】
20 3
|
1月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
61 2
|
1月前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
52 2