前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。

在前一篇文章 Deno2.0如何快速创建Restfulapi/静态文件托管应用及oak框架介绍 介绍了利用Deno2.0创建http服务端应用的方法,本文主要介绍如果利用它来构建Websocket全栈应用。而且,我可以大言不惭的称之为最佳的Websocket全栈应用js运行时

在全栈开发中,WebSocket 是一种非常常见的实时通信方式,而 Deno 作为一个新兴的 JavaScript/TypeScript 运行时,为创建 WebSocket 提供了更加简便的方式。在本文中,我们将讨论如何利用 Deno 2.0 快速创建 WebSocket 服务端和客户端应用。让我们通过一个简单的代码示例,来探索 Deno 在 WebSocket 实现中的便捷与强大。

Deno Deploy 代码和在线测试环境

准备工作

在本篇内容中,我们将会实现以下功能:

  1. 创建一个 Deno 服务端,用于处理 WebSocket 请求。
  2. 创建客户端页面,用于连接并与 WebSocket 服务器交互。(因为编码简化,按钮使用英文Connect=连接)
  3. 在服务端代码中同时连接自身进行内部测试。

代码示例如下所示:

// 下面这个方法是前后端共用了 - 便于展示前后端接口一致性复用的好处
const createSocket = (url: string, startPing = false, isWeb = false) => {
   
  const ws = new WebSocket(url);

  ws.onopen = () => {
   
    console.log(`ws open isWeb: ${
     isWeb}`);
    if (startPing) ws.send('ping');
  };

  ws.onmessage = (ev) => {
   
    console.log(`message:`, ev.data);
    if (isWeb) document.querySelector('#msg').innerText = ev.data;
  };

  ws.onerror = (err) => {
   
    console.log(`ws err isWeb: ${
     isWeb}`);
    console.error(err);
  };
};

Deno.serve((req) => {
   
  if (req.headers.get("upgrade") !== "websocket") {
   
    return new Response(`
        <div id=msg> messages </div>
        <script>
        // 这里就把共用的代码用最简单的方式传回给web前端,
        const createSocket = ${
     String(createSocket)};
        window.connect = () => createSocket('wss://' + location.host, true, true);
        </script>
        <button onclick="connect()">Connect</button>
    `, {
   
      headers: {
   
        'content-type': 'text/html'
      }
    });
  }
  const {
    socket, response } = Deno.upgradeWebSocket(req);
  socket.addEventListener("open", () => {
   
    console.log("a client connected!");
  });
  socket.addEventListener("message", (event) => {
   
    if (event.data === "ping") {
   
      socket.send("pong");
    }
  });
  return response;
});

setTimeout(() => {
   
  // 这里就是服务端直接跑一个客户端连接刚刚起来的服务端应用
  console.log(`server side client`);
  createSocket("wss://afraid-boar-70.deno.dev", true, false);
});

服务器端的websocket客户端连接:
8d3da5817788485790b667bdfb38c578.png

客户端的websocket客户端连接(点了connect之后)
5edaa5e9581243e5a0a72e4d7f744cc5.png

代码解析

服务端和客户端的集成

在上述代码中,Deno.serve() 方法用于创建一个 HTTP 服务器,并根据请求类型处理不同的响应:

  • 当请求头中不包含 "upgrade" : "websocket" 时,返回一个简单的 HTML 页面,该页面包含一个按钮用于手动连接到 WebSocket 服务端。
  • 当请求为 WebSocket 连接时,通过 Deno.upgradeWebSocket(req) 升级请求,并创建 WebSocket 连接。

客户端连接

我们在 HTML 中通过 <button> 元素来触发客户端 WebSocket 连接,并使用 createSocket() 函数来实现连接逻辑。该函数通过 JavaScript 原生的 WebSocket 对象来建立连接,并添加了一些监听事件用于响应连接的状态变化和消息接收。

createSocket(url: string, startPing = false, isWeb = false) 函数的主要逻辑:

  • onopen: 在 WebSocket 连接建立后调用,输出连接信息,并根据 startPing 参数发送 "ping" 消息。
  • onmessage: 在收到服务端消息时调用,输出消息内容,如果是网页端,则在页面上更新显示消息。
  • onerror: 在 WebSocket 出现错误时调用,输出错误信息。

服务端内部客户端连接

为了测试 WebSocket 连接,代码中还使用 setTimeout() 创建了一个延时调用,在服务端启动后通过 createSocket("wss://afraid-boar-70.deno.dev", true, false) 进行 WebSocket 客户端连接。这样可以让服务端自身成为一个客户端,与自己进行消息通信。

WebSocket 服务端处理流程

下面是一个使用 Mermaid 绘制的图,表示 WebSocket 服务端应用每个连接的处理流程:

graph TD
    A[接收请求] --> B{请求类型}
    B -- 非 WebSocket 请求 --> C[返回 HTML 页面]
    B -- WebSocket 请求 --> D[升级为 WebSocket]
    D --> E[监听 open 事件]
    E --> F[客户端连接成功]
    D --> G[监听 message 事件]
    G --> H{消息类型}
    H -- ping --> I[发送 pong]

运行示例(本地)

要运行这段代码,首先确保您已经安装了 Deno 运行时。然后可以通过以下命令运行代码:

deno run --allow-net your_file.ts

运行后,Deno 会启动一个 WebSocket 服务器,您可以在浏览器中访问相应的地址来看到网页客户端部分,点击 "Connect" 按钮即可连接到服务器并发送 ping 消息。

与 Node.js 创建 WebSocket 服务端应用的对比

在 Node.js 中创建 WebSocket 服务端通常需要借助第三方库,例如 wssocket.io。以下是与 Deno 创建 WebSocket 服务端的对比:

  • 依赖性:Deno 自带 WebSocket 支持,无需额外安装依赖,而在 Node.js 中,需要安装如 wssocket.io 等库。
  • 代码复杂性:使用 Deno 创建 WebSocket 服务端相对简单,只需调用 Deno.serve()Deno.upgradeWebSocket()。在 Node.js 中,通常需要编写更多的代码来处理 WebSocket 升级和连接。

例如,在 Node.js 中使用 ws 创建 WebSocket 服务器的代码如下:

const WebSocket = require('ws');

const wss = new WebSocket.Server({
    port: 8080 });

wss.on('connection', function connection(ws) {
   
  ws.on('message', function message(data) {
   
    console.log('received: %s', data);
    if (data === 'ping') {
   
      ws.send('pong');
    }
  });

  ws.send('connected');
});

与 Deno 相比,Node.js 的实现需要手动处理端口、连接事件等,相对复杂一些。但使用 socket.io 这样的库,可以提供更丰富的功能,例如房间管理、自动重连等。

与 Node.js 创建 WebSocket 客户端的对比

在 Node.js 中创建 WebSocket 客户端也需要依赖 ws 库,而在 Deno 中可以直接使用与前端一致的 WebSocket 接口进行连接,这使得代码更加统一,开发体验更好。

在 Deno 中,我们使用 WebSocket 对象来建立客户端连接,与前端 JavaScript 的使用方式完全相同,例如:

const ws = new WebSocket('wss://example.com');

而在 Node.js 中,代码如下:

const WebSocket = require('ws');

const ws = new WebSocket('wss://example.com');

ws.on('open', function open() {
   
  console.log('connected');
  ws.send('ping');
});

ws.on('message', function message(data) {
   
  console.log('received: %s', data);
});

Node.js 使用 ws 库来模拟浏览器中的 WebSocket 对象,但需要手动引入库,这使得代码在不同环境下不一致。而 Deno 则可以直接使用标准的 WebSocket 接口,这对于前端开发者来说更加自然和方便。

Deno、Bun 和 Node.js 对于 WebSocket 支持的对比

下表列出了 Deno、Bun 和 Node.js 在创建 WebSocket 服务端应用时的特性对比:

特性 Deno Bun Node.js (ws/socket.io)
内置 WebSocket 支持 否,需要额外库 否,需要额外库
升级 WebSocket 方法 Deno.upgradeWebSocket() 使用第三方库实现 使用 wssocket.io
依赖库 无需额外依赖 需要第三方库 需要 wssocket.io
代码复杂性 简单 依赖库特性,视实现而定 代码较多,依赖第三方库
性能 高效 高效 依赖库性能

下表列出了 Deno、Bun 和 Node.js 在创建 WebSocket 客户端应用时的特性对比:

特性 Deno Bun Node.js (ws)
WebSocket API 一致性 与前端一致 依赖库特性,可能不同 与前端不同,需要 ws
内置支持 否,需要额外库 否,需要 ws
依赖库 无需额外依赖 需要第三方库 需要 ws
代码复杂性 简单,与前端一致 依赖库特性,视实现而定 代码较多,需引入库

总结

通过上述代码示例,我们可以看到 Deno 提供了简洁高效的 WebSocket 支持,无需额外依赖包便可以快速搭建一个具备基本功能的 WebSocket 服务端和客户端。对于想要学习全栈开发的前端开发者来说,Deno 是一个值得尝试的新工具,它具有现代化的开发体验,同时又兼具简单易用的特性。希望这篇文章能帮助您迈出使用 Deno 的第一步,搭建自己的 WebSocket 应用。

怎么说呢?刚开始搭建这个后端的时候,我还走了不少弯路子,还在用Nodejs的思维 - -,实际上Deno简化了很多,作为客户端直接用Websocket就可以,而我还在jsr搜索。Deno2.0值得学习和使用,反正我是在慢慢的重写一个实时的应用了。

相关文章
|
3月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
105 1
|
2月前
|
JavaScript 前端开发 安全
2024年前端开发新趋势:TypeScript、Deno与性能优化
2024年前端开发迎来新趋势:TypeScript 5.0引入装饰器正式支持、const类型参数及枚举改进;Deno 1.42版推出JSR包注册表、增强Node.js兼容性并优化性能;性能优化策略涵盖代码分割、懒加载及现代构建工具的应用。这些变化推动前端开发向更高效率和安全性发展。
|
2月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
115 1
|
3月前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
168 3
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
2月前
|
Kubernetes Cloud Native JavaScript
为使用WebSocket构建的双向通信应用带来基于服务网格的全链路灰度
介绍如何使用为基于WebSocket的云原生应用构建全链路灰度方案。
|
3月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
132 2
|
3月前
|
JavaScript 前端开发 Serverless
前端全栈之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?可能Deno目前更适合serverless业务
在前端全栈开发中,Deno 2.0 和 Bun 作为新兴的 JavaScript 运行时,各自展现了不同的优势。Deno 2.0 重视安全性和多平台兼容性,尤其是对 Windows 的良好支持和原生 TypeScript 支持;而 Bun 则以卓越的性能和简便的开发体验著称,适合快速迭代的小型项目。两者在不同场景下各具特色,Deno 更适合企业级应用和serverless,Bun 则适用于追求速度的项目。
286 1
|
3月前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
4月前
|
JavaScript 前端开发 UED
WebSocket在Python Web开发中的革新应用:解锁实时通信的新可能
在快速发展的Web应用领域中,实时通信已成为许多现代应用不可或缺的功能。传统的HTTP请求/响应模式在处理实时数据时显得力不从心,而WebSocket技术的出现,为Python Web开发带来了革命性的变化,它允许服务器与客户端之间建立持久的连接,从而实现了数据的即时传输与交换。本文将通过问题解答的形式,深入探讨WebSocket在Python Web开发中的革新应用及其实现方法。
55 3
|
3月前
|
消息中间件 网络协议 安全
C# 一分钟浅谈:WebSocket 协议应用
【10月更文挑战第6天】在过去的一年中,我参与了一个基于 WebSocket 的实时通信系统项目,该项目不仅提升了工作效率,还改善了用户体验。本文将分享在 C# 中应用 WebSocket 协议的经验和心得,包括基础概念、C# 实现示例、常见问题及解决方案等内容,希望能为广大开发者提供参考。
183 0