简介
Deno 是一个由 Node.js 的创始人 Ryan Dahl 开发的新一代 JavaScript 运行时。与 Node.js 不同,Deno 内置了 TypeScript 和标准库,支持 ES 模块,提供了更好的安全控制,更好的构建工具和更优秀的性能。
在本文中,我们将重点讨论 Deno 的网络编程技巧,并给出相应的示例代码,帮助读者更好地使用和学习 Deno。
TCP Socket
Deno 内置的标准库提供了 TCP Socket 相关的 API,我们可以通过这些 API 很方便地实现 TCP Socket 的操作和管理。以下是一些常用的 API:
deno.listen
deno.listen
函数用于创建一个 TCP 服务器,返回一个 net.Listener
实例。示例代码如下:
const listener = Deno.listen({ port: 8000 }); console.log(`Listening on port 8000`); for await (const conn of listener) { console.log(`New connection from ${conn.remoteAddr}`); Deno.copy(conn, conn); }
以上代码创建了一个 TCP 服务器,监听端口为 8000。当有连接到达时,服务器会接受连接并在控制台输出相应信息。然后,将收到的数据复制到客户端连接中,并持续监听下一个连接。
deno.connect
deno.connect
函数用于创建一个 TCP 客户端并返回一个 net.Conn
实例。示例代码如下:
const conn = await Deno.connect({ hostname: "example.com", port: 80 }); await conn.write(new TextEncoder().encode("GET / HTTP/1.0\r\n\r\n")); const buf = new Uint8Array(100); await conn.read(buf); console.log(new TextDecoder().decode(buf)); conn.close();
以上代码创建了一个 TCP 客户端,连接到远程服务的 80 端口。然后向服务端发送一个 GET
请求,接收到数据并输出到控制台,最后关闭连接。
net.Listener 和 net.Conn
net.Listener
和 net.Conn
分别代表 TCP 服务器监听器和客户端连接。它们都实现了 Deno.Reader
和 Deno.Writer
接口,因此可以通过 Deno.copy
函数进行数据读写。同时,它们也包括了一些常用的操作:
listener.addr()
: 返回服务器地址conn.localAddr
: 返回本地地址conn.remoteAddr
: 返回远程地址
绑定本地地址和端口
可以使用 bind
字段绑定服务器监听地址和端口:
const listener = Deno.listen({ hostname: "192.168.1.100", port: 8000 });
也可以使用 deno.listen
的另一种形式来绑定服务器监听地址和端口:
const addr = "192.168.1.100:8000"; const listener = Deno.listen({ transport: "tcp", addr });
事件驱动服务器
Deno 提供了一组事件驱动服务器 API(deno.serve
,Deno.Signal
),可以让我们更加方便地实现服务。示例代码如下:
const server = Deno.serve({ port: 8000 }); console.log("Listening on http://localhost:8000/"); for await (const req of server) { req.respond({ body: "Hello, World!\n" }); }
以上代码创建了一个 HTTP 服务器,监听端口为 8000,并在收到请求时返回一个 Hello, World!
的响应。
WebSocket
Deno 提供了很多 WebSocket 相关的 API,使得我们可以很方便地实现 WebSocket 的连接和消息传输。下面是一些常用的 WebSocket API:
WebSocket 握手
WebSocket 握手是建立 WebSocket 连接的第一步。Deno 提供了 acceptWebSocket
函数,使得我们可以轻松地接受 WebSocket 连接。示例代码如下:
-- -------------------- ---- ------- ----- --- - ----- ------------------- -- ----------- --- ----- -- ------------------------------------------ --- ------------ - ----- --- -------------- --------- ---------- - ----- - ------- - - ---- ----- --------------- - --- ---------- ------------------------------ ------------- --------------------------------- ----------- -------------------- ----------------------- ----------------------------------------------------------- -- ---- -- ----- -------------------- ------- ---- -------- --------------- --- ----- --------- - ----- ----------------- ----- -------- ---------- ------------ ---------- ------------ ---
以上代码做了以下事情:
- 读取 HTTP 请求并验证是否为 WebSocket 握手请求;
- 发送响应消息,完成 WebSocket 握手;
- 使用
acceptWebSocket
函数接受 WebSocket 连接。
WebSocket 数据传输
与 TCP Socket 不同,WebSocket 是基于消息而不是流的传输协议。Deno 提供了 WebSocket API 的封装,使得我们可以以更加轻松的方式进行 WebSocket 数据传输。示例代码如下:
const websocket = await connectWebSocket("ws://localhost:8080"); await websocket.send("Hello, World!"); for await (const event of websocket) { console.log("WebSocket message:", event); }
以上代码实现了一下内容:
- 使用
connectWebSocket
函数连接到 WebSocket 服务器; - 发送一条消息到服务器;
- 打印接收到的消息。
WebSocket 传输协议
WebSocket 传输协议是 WebSocket 连接与服务端的通信协议。Deno 提供了以下 WebSocket 传输协议:
Text
: 文本消息传输协议Binary
: 二进制消息传输协议
示例代码如下:
const websocket = await connectWebSocket("ws://localhost:8080"); await websocket.send("Hello, World!", { type: "text" }); await websocket.send(new Uint8Array([0, 1, 2]), { type: "binary" });
以上代码发送文本和二进制消息到 WebSocket 服务器。
HTTPS
Deno 的标准库为我们提供了 HTTPS 服务器和 HTTPS 客户端的 API,使得我们可以以最简单的方式实现 HTTPS 连接。以下是一些示例代码:
HTTPS 服务器
const app = new Application(); app.use((ctx) => { ctx.response.body = "Hello, World!\n"; }); await app.listen({ port: 8000, tls: true });
以上代码创建了一个 HTTPS 服务器,监听 8000 端口并使用 TLS 加密通信。
HTTPS 客户端
const res = await fetch("https://example.com/"); const body = await res.text(); console.log(body);
以上代码创建了一个 HTTPS 客户端请求,并输出响应内容。
总结
本文总结了 Deno 网络编程中常用的一些 API 和技巧,并给出了相应的示例代码。Deno 相对于 Node.js 的改进,使得我们可以更加愉快地进行网络编程。希望读者可以通过本文的介绍更好地学习和使用 Deno。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6652d468d3423812e475b44e