uWebSockets.js是Node.js上的用于快速创建HTTP/WebSocket服务器的包。

它是由C/C++项目迁移到Node.js上来的。


介绍

如果你还没了解什么是WebSocket,为什么不看看阮一峰的网络日志呢

uWebSockets.js的原身是uWebSockets,后者是一个非常高性能的服务器的C/C++实现。

那么,迁移过来的uws.js自然也不会差!

Node.js上创建WebSocket服务器还有一些其他的方案,例如socke.io

但uws.js官方吹的很玄乎:

µWebSockets.js is an HTTP/WebSocket server for Node.js that runs 8.5x that of Fastify and at least 10x that of Socket.IO.

听起来好像很快(不对比较对象的实力进行深究)!是不是很想试一试了呢?


入门使用小样例

环境需要node.js,请务必安装好再进行。

另外, 更多千奇百怪的用法可以参考官方提供的各种样例,还可以查阅官方文档

快速创建WS服务

首先,你得先在你的项目里获取最新版本的包。

你可以选择新建一个空的文件夹,然后在新建的文件夹里执行命令行:

npm i uWebSockets.js@uNetworking/uWebSockets.js#latest
# 如果你使用yarn作为包管理器,用下面这条:
yarn add uWebSockets.js@uNetworking/uWebSockets.js#latest

在项目根目录创建一个app.js,开始愉快的代码吧:

const uws = require('uWebSockets.js')
const port = 9001 //定义端口

uws
  .App() // 创建一个简单的uws服务,也可以通过SSLApp创建带安全证书的服务。
  // 链式语法
  // websocket
  .ws('/*', {
    idleTimeout: 32,
    maxBackpressure: 1024,
    maxPayloadLength: 512,
    compression: uws.SHARED_COMPRESSOR,

    message: (ws, message, isBinary) => {
      // 将接收到用户发送的信息重新发送给用户
      ws.send(message, isBinary, true)
    },
  })
  // 监听端口
  .listen(port, (listenSocket) => {
    if (listenSocket) {
      console.log(`Listening to http://127.0.0.1:${port}`)
    }
  })

直接在命令行输入node ./app.js运行服务,或者在package.json中添加script也行:

{
  "scripts": {
    "start": "nodemon ./app.js"
  },
  "dependencies": {
    "uWebSockets.js": "uNetworking/uWebSockets.js#latest"
  }
}

修改完package.json只要在命令行执行yarn start即可,要用nodemon的话别忘了npm i -g nodemon

可以用Hoppscotch测试一下有无问题:

uws-test

明显无问题。

HTTP请求处理

当然,你也可以用uws来处理http请求:

/* ... */

  // http
  .get('/:name', (res, req) => {
    const param = req.getParameter(0) //获取params传参的name值
    res
      .writeStatus('200 OK')
      .writeHeader('IsExample', 'Yes')
      .end(`Hello ${param}`)
  })

/* ... */

但说实话,这个绝对只会让你更想用别的WEB框架……

完整代码参考

完整的app.js代码如下:

const uws = require('uWebSockets.js')
const port = 9001 //定义端口

uws
  .App() // 创建一个简单的uws服务,也可以通过SSLApp创建带安全证书的服务。
  // 链式语法
  // websocket
  .ws('/*', {
    idleTimeout: 32,
    maxBackpressure: 1024,
    maxPayloadLength: 512,
    compression: uws.SHARED_COMPRESSOR,

    message: (ws, message, isBinary) => {
      // 将接收到用户发送的信息重新发送给用户
      ws.send(message, isBinary, true)
    },
  })
  // http
  .get('/:name', (res, req) => {
    const param = req.getParameter(0) //获取params传参的name值
    res
      .writeStatus('200 OK')
      .writeHeader('IsExample', 'Yes')
      .end(`Hello ${param}`)
  })
  // 监听端口
  .listen(port, (listenSocket) => {
    if (listenSocket) {
      console.log(`Listening to http://127.0.0.1:${port}`)
    }
  })

参考链接

  1. uws.js的github主页:https://github.com/uNetworking/uWebSockets.js
  2. uws.js的文档:https://unetworking.github.io/uWebSockets.js/generated/
  3. 阮一峰有关WebSocket的博客:https://www.ruanyifeng.com/blog/2017/05/websocket.html