使用WebSocket

要使用WebSocket,关键在于服务器端支持,这样,我们才有可能用支持WebSocket的浏览器使用WebSocket。

ws模块

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

"dependencies": {
    "ws": "1.1.1"
}

整个工程结构如下:

hello-ws/
|
+- .vscode/
|  |
|  +- launch.json <-- VSCode 配置文件
|
+- app.js <-- 启动js文件
|
+- package.json <-- 项目描述文件
|
+- node_modules/ <-- npm安装的所有依赖包

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

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

// 导入WebSocket模块:
const WebSocket = require('ws');

// 引用Server类:
const WebSocketServer = WebSocket.Server;

// 实例化:
const wss = new WebSocketServer({
    port: 3000
});

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

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

wss.on('connection', function (ws) {
    console.log(`[SERVER] connection()`);
    ws.on('message', function (message) {
        console.log(`[SERVER] Received: ${message}`);
        ws.send(`ECHO: ${message}`, (err) => {
            if (err) {
                console.log(`[SERVER] error: ${err}`);
            }
        });
    })
});

connection事件中,回调函数会传入一个WebSocket的实例,表示这个WebSocket连接。对于每个WebSocket连接,我们都要对它绑定某些事件方法来处理不同的事件。这里,我们通过响应message事件,在收到消息后再返回一个ECHO: xxx的消息给客户端。

创建WebSocket连接

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

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

// 打开一个WebSocket:
var ws = new WebSocket('ws://localhost:3000/test');
// 响应onmessage事件:
ws.onmessage = function(msg) { console.log(msg); };
// 给服务器发送一个字符串:
ws.send('Hello!');

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

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

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

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

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

客户端的写法如下:

let ws = new WebSocket('ws://localhost:3000/test');

// 打开WebSocket连接后立刻发送一条消息:
ws.on('open', function () {
    console.log(`[CLIENT] open()`);
    ws.send('Hello!');
});

// 响应收到的消息:
ws.on('message', function (message) {
    console.log(`[CLIENT] Received: ${message}`);
}

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

同源策略

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

路由

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

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

参考源码

hello-ws

Angular 是一个基于 TypeScript 的开源前端框架,它使用组件化的方式来构建单页应用程序(SPA)。WebSocket 是一种网络通信协议,提供了浏览器和服务器之间的全双工通信渠道。在 Angular 中使用 WebSocket 可以实现实时、双向的通信。 要在 Angular 中使用 WebSocket,你可以使用原生的 WebSocket API,或者使用一些封装好的库,例如 `ng2-websocket` 或 `angular-websocket`。以下是使用原生 WebSocket API 的基本步骤: 1. 创建 WebSocket 连接:在你的 Angular 组件中,你可以创建一个新的 WebSocket 对象来连接到服务器的 WebSocket 端点。 ```typescript import { WebSocketSubject } from 'rxjs/webSocket'; import { filter } from 'rxjs/operators'; // 创建 WebSocketSubject 实例来连接到服务器 const ws = new WebSocketSubject('ws://your-websocket-server.com'); // 使用 WebSocketSubject 订阅消息 ws.subscribe( message => console.log('Received message:', message), error => console.error('WebSocket error:', error), () => console.log('WebSocket connection closed.') ); // 发送消息到服务器 ws.next('Hello Server!'); ``` 2. 处理消息:使用 RxJS 的 `filter` 操作符来过滤接收到的消息,并处理特定类型的消息。 3. 关闭连接:在组件销毁时或适当的时候,关闭 WebSocket 连接。 ```typescript ngOnDestroy() { this.ws.unsubscribe(); } ``` 使用 WebSocket 的好处包括: - 实现实时通信,如即时聊天应用、在线游戏、实时监控系统等。 - 减少了服务器负载,因为 WebSocket 连接可以保持打开状态,减少 HTTP 请求。 - 提供了更为稳定的双向通信,特别是对于移动设备,可以通过长连接维持与服务器的持续通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值