worker 服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
export default {
async fetch(request, env, ctx) {
const upgradeHeader = request.headers.get('Upgrade');
console.log('An request is received');
//若不是wss协议则不处理
if (!upgradeHeader || upgradeHeader !== 'websocket') {
return new Response('Expected Upgrade: websocket', { status: 426 });
}
const webSocketPair = new WebSocketPair();
//获取客户端-服务端对
const [client, server] = Object.values(webSocketPair);
server.accept();
server.addEventListener('message', (event) => {
console.log(event.data);
//使用server向客户端发送数据
server.send(event.data);
});
//切换协议
return new Response(null, {
status: 101,
webSocket: client,
});
// return new Response('Hello World!');
},
};
客户端
⚠️ 注意:在 workers 中部署和测试中,若为本地 dev 测试,只能使用ws协议连接。
若要部署到公网上,无法直接使用 wokers 所提供的默认路由(ws 和 wss 都无法使用),
需要绑定一个子域名才能使用(在子域名添加 dns 记录后会颁发 ssl/tls 证书)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const WebSocket = require("ws");
const websocket = new WebSocket("ws://127.0.0.1:8787");
websocket.addEventListener("message", (event) => {
console.log("Message received from server");
console.log(event.data);
});
websocket.addEventListener("open", (event) => {
console.log("Connected to server");
websocket.send("Hello!");
});
websocket.addEventListener("error", (err) => {
console.log(err);
});
websocket.addEventListener("close", (e) => {
console.log(e);
});
// 定时发送消息
setInterval(() => {
websocket.send("periodic message");
}, 1000);
其他
若要持久化链接对象,可以使用 cloudflare workers 的 Durable Objects 服务(需要氪金的力量)