Cloudflare系列(三):Cloudflare WebSocket

cloudflare workers WebSocket 的使用

Posted by Momoka7 on June 17, 2024

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 服务(需要氪金的力量)