一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
前情提要
- 本文跳过保姆式教程,只讲重点。其他的要自己去了解哟。
- 一般情况下,我们去搭建一个管理系统的后端服务时,可能只需要搭建一个http服务就可以了。最多再配置个https服务。但是总有那么些个时候我们需要用上websocket服务,比如聊天室,比如管理系统中的消息模块,比如一些跨域处理,比如模拟消息中间件实现多服务的负载均衡等。那我们该怎么处理呢?我们该怎么让http和ws服务同时共存呢?
- 准备工作:
- 首先我们本地需要有node环境。然后全局npm install -g koa-generator
- koa-generator是koa2提供的一个生成器,可以理解为脚手架。开箱即用。
- 然后通过koa2 koaproject(koaproject是你想创建的项目名称)
- 首先我们本地需要有node环境。然后全局npm install -g koa-generator
正文
- 其实当通过脚手架生成一个koa2的项目后,这个http服务就已经搭建完成了。我们只需要通过创建controller模块,管理一下router模块,有需要的话再将model模块搞一下。这样就是一个完整的http服务了。
- 那么该如何在http的基础上增加ws服务呢?
- 首先我们这里采用的是node的基础模块:ws模块以及http模块
- 声明http模块的服务:var server = http.createServer(app.callback());
- 声明一个ws服务:let ws = new websocket.Server({ server })。这个时候就将http服务和ws服务绑定在一起了。其中websocket指的是导入的node的ws模块。
- wsss.createWss(ws):其中wss是自己在项目里封装的ws模块。里面主要包含了content,close,message的监听,以及对所有的消息类型进行分类处理的文件。
- 至此一个http与ws同时存在的服务就搭建好了。他们两个共用一个端口号。
- 背景:该需求主要是在写一个聊天室的网站时遇到的。当时也是查了好久才找到的。前后端采用的ws均是原生的websocket,未使用第三方插件。
- 关于ws的思路:
- 当时写的时候,将所有的客户端的消息的处理都写在了一起,代码比较庞大,而且不利于维护。
- 改进点:将消息类型进行抽离,处理方法进行抽离。这样就可以实现解耦,在维护上就大有裨益。
代码截图
- www文件的文件导入
- 自己封装的wss模块