确保客户端和服务器之间高效、无缝的通信是构建现代实时 Web 应用程序的关键。传统的 HTTP 请求(如轮询中使用的请求)是无状态且单向的。客户端向服务器发出请求(例如,使用 fetch 或 axios),服务器在连接关闭之前做出响应。如果客户端需要新鲜数据,则必须定期重复发送新请求,从而造成不必要的延迟并增加客户端和服务器的负载。
例如,如果您正在构建实时聊天应用程序或股票价格跟踪器,则轮询将要求客户端每秒左右请求更新一次,即使没有新数据可供获取。这就是 WebSockets 的闪光点。
WebSockets 在客户端和服务器之间提供持久的双向通信通道。连接建立后,服务器可以立即将更新推送到客户端,而无需等待新的请求。这使得 WebSockets 非常适合需要实时更新的场景,例如:
在客户端使用 Vanilla JavaScript,在服务器端使用 Bun 运行时,使得 WebSocket 的实现变得简单而高效。例如:
在这种情况下,WebSocket 比传统的轮询方法提供更低的延迟、减少的服务器负载以及更流畅的用户体验。
首先,确保 Bun 已安装。然后新建一个Bun项目,新建一个空目录,进入新目录,通过bun init命令初始化项目:
mkdir websocket-demo cd websocket-demo bun init
bun init 命令将创建 package.json 文件、“hello world”index.ts 文件、.gitignore 文件、用于打字稿配置的 tsconfig.json 文件和 README.md 文件。
现在,您可以开始创建 JavaScript 代码。我将向您展示整个脚本;然后我们将探索所有相关部分。您可以编辑index.ts文件:
console.log("? Hello via Bun! ?"); const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/") return new Response(Bun.file("./index.html")); if (url.pathname === "/surprise") return new Response("?"); if (url.pathname === "/chat") { if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed", { status: 400 }); } return new Response("404!"); }, websocket: { message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); }, // a message is received open(ws) { console.log("? A new Websocket Connection"); ws.send("? Welcome baby"); }, // a socket is opened close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); }, // a socket is closed drain(ws) { console.log("DRAIN EVENT"); }, // the socket is ready to receive more data }, }); console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`);
下面是所提供代码的细分,解释了每个部分及其功能。
mkdir websocket-demo cd websocket-demo bun init
Bun.serve 方法初始化一个能够处理 HTTP 和 WebSocket 请求的服务器。
console.log("? Hello via Bun! ?"); const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/") return new Response(Bun.file("./index.html")); if (url.pathname === "/surprise") return new Response("?"); if (url.pathname === "/chat") { if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed", { status: 400 }); } return new Response("404!"); }, websocket: { message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); }, // a message is received open(ws) { console.log("? A new Websocket Connection"); ws.send("? Welcome baby"); }, // a socket is opened close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); }, // a socket is closed drain(ws) { console.log("DRAIN EVENT"); }, // the socket is ready to receive more data }, }); console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`);
websocket 键定义事件处理程序来管理 WebSocket 连接。
const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 ... });
客户端建立 WebSocket 连接时触发。
fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/") return new Response(Bun.file("./index.html")); if (url.pathname === "/surprise") return new Response("?"); if (url.pathname === "/chat") { if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed", { status: 400 }); } return new Response("404!"); }
服务器收到客户端消息时触发。
open(ws) { console.log("? A new Websocket Connection"); ws.send("? Welcome baby"); }
WebSocket 连接关闭时触发。
参数:
message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); }
当 WebSocket 在暂时不堪重负后准备好接受更多数据时,会触发排出事件。
close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); }
服务器运行后将其 URL 记录到控制台。
一旦你有了index.ts文件,你就可以通过bun run启动服务器:
drain(ws) { console.log("DRAIN EVENT"); }
服务器已准备就绪并已启动并正在运行。现在,我们可以实现客户端了。
现在我们了解了处理 WebSocket 的脚本的结构,接下来的步骤是:
以上是使用 JavaScript 和 Bun 的 WebSocket的详细内容。更多信息请关注PHP中文网其他相关文章!