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
函数中,我们需要传入 conn
、bufReader
、bufWriter
和 headers
这几个参数。其中,conn
是一个 Deno.Conn
类型的对象,表示当前连接,bufReader
和 bufWriter
分别是读写缓冲区,headers
是 HTTP 请求头。通过 await acceptWebSocket
函数,我们可以获得一个 WebSocket
类型的对象 sock
,通过这个对象就可以进行 WebSocket 通信了。
Deno 中的 WebSocket 通信
在 Deno 中使用 WebSocket 通信,我们需要分别编写客户端和服务器端的代码。
客户端
首先,让我们来编写一个简单的 WebSocket 客户端代码。客户端代码如下:
-- -------------------- ---- ------- ----- ----- --------- - --- ---------------------------------- ----------- - -- -- - ------------------- ------------ ----------------- ---- ------------ -- -------------- - ------- ------------- -- - ---------------------- -- ------------ -- ------------ - ------- ------ -- - ---------------------- ------ -- ------- -- ------------ - ------- ----------- -- - ---------------------- ------- -- ----------- -------------- --
在客户端中,我们通过 new WebSocket
函数创建一个 WebSocket 对象,指定服务器的地址和端口号。通过对象的 onopen
、onmessage
、onerror
和 onclose
四个事件监听函数,分别处理连接建立后的操作、收到消息后的处理、连接异常的处理和连接关闭的处理。在示例代码中,连接建立后,我们向服务器发送了一条消息,然后等待服务器发回响应,最后关闭连接。
服务器端
接下来,我们来编写 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