Deno 中如何使用 WebSocket 实现即时通信?

WebSocket 是一种在单个 TCP 连接上进行双向通信的协议。它可以实现即时通信,包括聊天室、实时游戏、协作等场景。在 Deno 中,我们可以使用标准库中的 WebSocket 模块来实现 WebSocket 通信。本文将介绍如何在 Deno 中使用 WebSocket 实现即时通信。

WebSocket 基础知识

WebSocket 是一种基于 HTTP 协议的协议,它使用 HTTP 协议的 80 和 443 端口。在客户端和服务器建立连接后,双方都可以发送消息给对方。WebSocket 有以下几个特点:

  • 建立连接需要经过 HTTP 握手,但是之后的通信数据都是二进制数据而不是文本数据。
  • 可以在客户端和服务器之间双向传输数据。
  • WebSocket 连接是持久化的,一旦建立连接,客户端和服务器之间可以长时间保持连接。
  • 可以通过心跳机制保持连接不断开。

在 Deno 中,使用 WebSocket 的基本流程如下:

------ -
  ------
  -------
  ----------
- ---- ----------------------------------

----- ------- ------ - ------- ----- ---- ---

---------------------- ------ ------- -- ---- -------

--- ----- ------ --- -- ------- -
  ----- - ----- -- ---------- -- ---------- ------- - - ----
  ----- ----- --------- - ----- -----------------
    -----
    ----------
    ----------
    --------
  ---
  ------------------- ------------
-

通过 serve 函数创建一个服务器,并监听端口 8080。当客户端连接到服务器时,会触发 for await (const req of server),然后通过 acceptWebSocket 函数建立一个 WebSocket 连接。在 acceptWebSocket 函数中,我们需要传入 connbufReaderbufWriterheaders 这几个参数。其中,conn 是一个 Deno.Conn 类型的对象,表示当前连接,bufReaderbufWriter 分别是读写缓冲区,headers 是 HTTP 请求头。通过 await acceptWebSocket 函数,我们可以获得一个 WebSocket 类型的对象 sock,通过这个对象就可以进行 WebSocket 通信了。

Deno 中的 WebSocket 通信

在 Deno 中使用 WebSocket 通信,我们需要分别编写客户端和服务器端的代码。

客户端

首先,让我们来编写一个简单的 WebSocket 客户端代码。客户端代码如下:

----- ----- --------- - --- ----------------------------------

----------- - -- -- -
  ------------------- ------------
  ----------------- ---- ------------
--

-------------- - ------- ------------- -- -
  ---------------------- -- ------------
--

------------ - ------- ------ -- -
  ---------------------- ------ -- -------
--

------------ - ------- ----------- -- -
  ---------------------- ------- -- ----------- --------------
--

在客户端中,我们通过 new WebSocket 函数创建一个 WebSocket 对象,指定服务器的地址和端口号。通过对象的 onopenonmessageonerroronclose 四个事件监听函数,分别处理连接建立后的操作、收到消息后的处理、连接异常的处理和连接关闭的处理。在示例代码中,连接建立后,我们向服务器发送了一条消息,然后等待服务器发回响应,最后关闭连接。

服务器端

接下来,我们来编写 WebSocket 服务器端的代码。服务器端代码如下:

------ -
  ------
  -------
  ----------
  ----------------------
  ---------------------
- ---- ----------------------------------

----- ------- ------ - ------- ----- ---- ---

---------------------- ------ ------- -- ---- -------

--- ----- ------ --- -- ------- -
  ----- - ----- -- ---------- -- ---------- ------- - - ----
  --- -
    ----- ----- --------- - ----- -----------------
      -----
      ----------
      ----------
      --------
    ---
    ------------------- ------------

    --- ----- ------ -- -- ----- -
      -- ------- -- --- --------- -
        ---------------------- -- ----
        --------------
      - ---- -- -------------------------- -
        --------------------- -------
      - ---- -- --------------------------- -
        ------------------- --------- -------- -----------
      -
    -
  - ----- ----- -
    --------------------- -- ------ ---------- ---------
    ----- ------------- ------- --- ---
  -
-

在服务器端的代码中,我们首先通过 serve 函数创建一个服务器,并监听端口 8080。当客户端连接到服务器时,会触发 for await (const req of server),然后通过 acceptWebSocket 函数建立一个 WebSocket 连接。

在建立连接后,我们通过 for await (const ev of sock) 循环来监听消息。当客户端发送消息时,我们通过 typeof ev === "string" 来判断消息类型是否为字符串,如果是字符串,说明客户端发送了一个文本消息,我们就将消息发回客户端。如果收到的是 ping 消息,我们只需要忽略即可。最后,如果客户端关闭了连接,我们会通过 isWebSocketCloseEvent(ev) 来判断,并输出关闭原因。

总结

WebSocket 是一种非常实用的协议,可以实现即时通信。在 Deno 中,我们可以使用标准库中的 WebSocket 模块来实现 WebSocket 通信。在本文中,我们介绍了 Deno 中使用 WebSocket 实现即时通信的基本流程,并提供了客户端和服务器端的示例代码。如果你打算使用 Deno 开发即时通信应用程序,希望本文对你有所帮助。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66553e75d3423812e49c0d6e


猜你喜欢

  • SSE 防火墙和安全策略的处理方法

    引言 Server-Sent Events(SSE)是一种基于 HTTP 协议的服务器推送技术,可以让服务器向客户端推送事件,这种技术在很多场景中可以提高网站或应用程序的实时性和响应性。

    5 个月前
  • Cypress 测试实战:如何优化测试错折现象?

    前言 在前端开发过程中,为了保证项目可靠性和稳定性,我们经常需要进行测试。而难免会遇到测试错折现象,即在某个测试用例失败后,之后的多个测试用例也跟着失败,让我们的测试变得失去效果。

    5 个月前
  • Koa2 实现 OAuth2.0 鉴权服务

    OAuth2.0 是一种流行的授权协议,用于在客户端和资源拥有者之间传递访问受限的资源。在前端应用程序中,在请求服务端资源之前,需要进行授权认证,OAuth2.0 协议提供了一种安全且灵活的身份验证方...

    5 个月前
  • 如何使用 Deno 实现 GraphQL 服务?

    GraphQL 是一种跨平台的查询语言,它建立在强类型系统上,可以帮助开发人员快速构建功能强大的 API。Deno 是一个新兴的 JavaScript 运行时,它通过内置的安全性和一组有用的功能来提高...

    5 个月前
  • 异步 JavaScript:ECMAScript 2018 的 Thenable 任务

    在前端开发中,经常会遇到需要进行异步操作的情况,例如发送网络请求、读取文件等。在 JavaScript 中,异步操作往往需要使用回调函数来处理,而随着业务逻辑的复杂化,回调函数会越来越难以维护和管理。

    5 个月前
  • 自定义元素如何在 Web Worker 中使用

    随着 Web 应用程序的复杂度不断增加,将应用程序的核心逻辑从主线程中移出成为了一个必不可少的选择,这也是为什么我们需要使用 Web Worker 的主要原因之一。

    5 个月前
  • 初学者指南:如何从头开始使用 Webpack

    Webpack 是一个模块化打包工具,它可以将多个 JavaScript 文件打包成一个单独的文件,也可以为其他类型的文件进行打包和转换(例如,SCSS、图片和字体文件等)。

    5 个月前
  • Vue.js 中如何部署项目到服务器

    Vue.js 是一款流行的前端框架,开发者可以使用它来构建单页面应用程序或复杂的交互式用户界面。一旦构建出的项目准备部署到服务器,开发者需要一些技术来完成这项任务。

    5 个月前
  • Sequelize 之查询条件中使用 LIKE 匹配详解

    Sequelize 是 Node.js 环境下比较流行的 ORM 库,它可以让我们用 JavaScript 的方式来操作数据库,使我们的代码更加简洁高效。在 Sequelize 的使用过程中,我们经常...

    5 个月前
  • C++ MFC 应用程序无障碍调试实用技巧分享

    前言 MFC (Microsoft Foundation Classes) 是一种用于创建 Windows 应用程序的 C++ 类库。MFC 应用程序开发需要掌握大量的 Windows API 接口,...

    5 个月前
  • PM2 自动监控 node.js 进程

    如果你是一名前端开发者,你应该已经使用过 node.js 来开发后端应用了。但是,每次启动应用程序时,您是否会遇到以下问题? 应用崩溃,需要重新启动。 进程挂起,需要手动恢复。

    5 个月前
  • Mongoose 中断指令的使用:break 和 return

    在使用 Mongoose 操作数据库时,有时候需要在某些条件下停止代码的执行。这时候就需要使用 break 和 return 这两个中断指令。 break 在循环执行代码时,break 可以用来立即停...

    5 个月前
  • Enzyme 中使用 mockReturnValue() 模拟函数的返回值

    Enzyme 中使用 mockReturnValue() 模拟函数的返回值 在前端的开发中,单元测试是非常重要的一个环节,而在实现单元测试的过程中,为了保证测试的准确性和可靠性,我们经常需要模拟一些函...

    5 个月前
  • 使用 ESLint 对文件代码进行规范化

    随着前端开发技术的不断发展,代码规范化成为了技术团队中不可避免的话题。ESLint 作为一个基于 JavaScript 的代码检查工具,能够对代码的质量和风格进行自动化检测,提高代码的可读性、可维护性...

    5 个月前
  • 如何使用 GraphQL 实现本地状态管理

    如何使用 GraphQL 实现本地状态管理 GraphQL 是一种新兴的数据查询语言,它可以帮助前端开发者更快地获取数据并在本地状态中管理它们。本文将探讨如何使用 GraphQL 实现本地状态管理,内...

    5 个月前
  • 适配 Material Design 的最佳实践和技巧

    Material Design 是谷歌推出的一种设计语言,用于提供一种现代化的设计方法,使用户体验更加统一。这种设计语言强调简洁、明亮、真实和有意义。如今,越来越多的网站和移动应用开始采用 Mater...

    5 个月前
  • TypeScript 中函数重载的使用方法

    在 TypeScript 中,函数重载是一种可以解决函数参数类型不确定的问题的方法。本文将详细介绍 TypeScript 中函数重载的使用方法,并提供示例代码和学习指导。

    5 个月前
  • MongoDB 遇到 Cannot find module 'bson' 的解决方法

    在使用 Node.js 开发中,我们经常需要和 MongoDB 进行交互。在使用 MongoDB 官方提供的 Node.js 驱动程序时,可能会遇到 “Cannot find module 'bson...

    5 个月前
  • socket.io 实现 websocket 双工通信功能

    在现代网络应用中,实时双向通信非常关键。传统的 HTTP 协议是一种无状态的请求响应模式,无法进行实时通信,但是 WebSocket 协议提供了一种长连接方式,可以实现双向通信。

    5 个月前
  • 使用 Web Components 更快地构建网页

    Web Components 是一组技术的集合,旨在帮助开发者创建可复用且容易维护的组件,从而提高网页构建的效率。本文将介绍 Web Components 技术,其如何加速开发并提高网页的质量,以及如...

    5 个月前

相关推荐

    暂无文章