在Node.js中,使用最广泛的WebSocket模块是,我们创建一个hello-ws的VS Code工程,然后在package.json中添加ws的依赖:

    整个工程结构如下:

    1. hello-ws/
    2. |
    3. +- .vscode/
    4. | +- launch.json <-- VSCode 配置文件
    5. |
    6. +- app.js <-- 启动js文件
    7. |
    8. +- package.json <-- 项目描述文件
    9. |
    10. +- node_modules/ <-- npm安装的所有依赖包

    运行npm install后,我们就可以在app.js中编写WebSocket的服务器端代码。

    创建一个WebSocket的服务器实例非常容易:

    这样,我们就在3000端口上打开了一个WebSocket Server,该实例由变量引用。

    接下来,如果有WebSocket请求接入,wss对象可以响应connection事件来处理这个WebSocket:

    1. wss.on('connection', function (ws) {
    2. console.log(`[SERVER] connection()`);
    3. console.log(`[SERVER] Received: ${message}`);
    4. ws.send(`ECHO: ${message}`, (err) => {
    5. if (err) {
    6. console.log(`[SERVER] error: ${err}`);
    7. }
    8. });
    9. })
    10. });

    创建WebSocket连接

    现在,这个简单的服务器端WebSocket程序就编写好了。如何真正创建WebSocket并且给服务器发消息呢?方法是在浏览器中写JavaScript代码。

    先在VS Code中执行app.js,或者在命令行用npm start执行。然后,在当前页面下,直接打开可以执行JavaScript代码的浏览器Console,依次输入代码:

    一切正常的话,可以看到Console的输出如下:

    1. MessageEvent {isTrusted: true, data: "ECHO: Hello!", origin: "ws://localhost:3000", lastEventId: "", source: null…}

    这样,我们就在浏览器中成功地收到了服务器发送的消息!

    如果嫌在浏览器中输入JavaScript代码比较麻烦,我们还可以直接用ws模块提供的WebSocket来充当客户端。换句话说,ws模块既包含了服务器端,又包含了客户端。

    wsWebSocket就表示客户端,它其实就是WebSocketServer响应connection事件时回调函数传入的变量ws的类型。

    在Node环境下,ws模块的客户端可以用于测试服务器端代码,否则,每次都必须在浏览器执行JavaScript代码。

    从上面的测试可以看出,WebSocket协议本身不要求同源策略(Same-origin Policy),也就是某个地址为http://a.com的网页可以通过WebSocket连接到ws://b.com。但是,浏览器会发送Origin的HTTP头给服务器,服务器可以根据Origin拒绝这个WebSocket请求。所以,是否要求同源要看服务器端如何检查。

    路由

    还需要注意到服务器在响应connection事件时并未检查请求的路径,因此,在客户端打开可以写任意的路径。

    实际应用中还需要根据不同的路径实现不同的功能。

    读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论:

    使用ws - 图2