2,服务端和客户端WebSocket开发(服务端:nodejs+ws,客户端:CocosCreator)

  • Post author:
  • Post category:其他




前言

nodejs游戏服务器开发系列文章以nodejs+Typescript+CocosCreator+WebSocket为例,搭建服务器和客户端。



WebSocket介绍

官网:

http://websocket.org/index.html


详细介绍参考阮一峰的教程:

http://www.ruanyifeng.com/blog/2017/05/websocket.html


还有这两篇文章,写的非常好:

WebSocket介绍一



WebSocket介绍二


官方API地址:

https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

需要注意:

RFC规范指出,WebSocket是一个message-based的协议,它可以自动将数据分片,并且自动将分片的数据组装。

也就是说,WebSocket的RFC标准是不会产生粘包(sticky)、半包(half a pack)问题的。无需应用层开发人员关心缓存以及手工组装message。WebSocket API中提供的message响应就是一个完整的消息。

但是需要注意的是,由于各个WebSocket库对RFC规范实现的良莠不齐,有些库还是会有一些莫名问题,需要自己甄别。特别是当你的数据message特别大的时候(到底是多大是特别大,由具体实现决定)。



nodejs集成WebSocket

nodejs中最常用的WebSocket库ws托管在git上

https://github.com/websockets/ws


api文档为:

https://github.com/websockets/ws/blob/master/doc/ws.md

安装方法:

服务器项目目录Server下执行

npm install ws


会在node_modules目录下添加ws和async-limiter文件夹。

继续执行

npm install @types/ws

,会在node_modules/@types目录下添加ws文件夹,其内为ws模块的声明文件。



WebSocket数据类型

WebSocket数据传输类型只支持文本类型和二进制类型。二进制支持Blob和ArrayBuffer两种类型。二进制默认是Blob类型。

// 设置二进制数据类型为blob(默认类型)
ws.binaryType = "blob";
// Event handler for receiving Blob messages
ws.onmessage = function(e) {
if(e.data instanceof Blob){
console.log("Blob message received", e.data);
var blob = new Blob(e.data);
}
};
//ArrayBuffer
ws.binaryType = "arraybuffer";
ws.onmessage = function(e) {
if(e.data instanceof ArrayBuffer){
console.log("ArrayBuffer Message Received", + e.data);
// e.data即ArrayBuffer类型
var a = new Uint8Array(e.data);
}
};



写一个简单的WebSocket服务器

打开index.ts,复制以下内容:

import * as WebSocket from "ws"
const server = new WebSocket.Server({ port: 8083 });
server.on("listening", () => {
    console.log("服务器启动完毕!开始侦听");
});

server.on("connection", function connection(ws) {
    ws.on("message", function incoming(message) {
        console.log("received:%s", message);         
    });
    ws.send("hhhello");
});



客户端代码

typescript已经封装有WebSocket模块,使用自带的即可。

    private ws: WebSocket;
    start() {
        console.log("go!");
        this.ws = new WebSocket("ws://192.168.2.31:8083");

        this.ws.onopen = this.onOpen.bind(this);
        this.ws.onmessage = function (event) {
            console.log("client rcv:" + event.data);
        }.bind(this);
        this.ws.onclose = function (event) {
            console.log("服务器已关");
        }.bind(this);
        this.ws.onerror = function (event) {
        }.bind(this);
    }

    private onOpen(event: MessageEvent) {
        console.log("连接建立啦");
        this.sendData(JSON.stringify({
            ctype: "login",
            data: {
                name: "jack",
                age: 22
            }
        }));
    }
    private sendData(data) {
        this.ws.send(data);
    }



总结

上述代码演示了,客户端把JSON格式的数据字符串化,传给服务器。



版权声明:本文为iningwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。