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

转载自:https://blog.csdn.net/iningwei/article/details/100106243

前言
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特别大的时候(到底是多大是特别大,由具体实现决定)。

转载自:https://blog.csdn.net/iningwei/article/details/100106243

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格式的数据字符串化,传给服务器。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值