前言
Deno 是一个新兴的 JavaScript/TypeScript 运行时环境,与 Node.js 相比,它在安全性、可维护性和性能方面都有很大的提升。在 Deno 中,我们可以使用标准的 TCP 套接字接口进行网络编程,本文将介绍 Deno 中的 TCP 套接字 API 的使用方法和一些注意事项。
在本文中,我们将使用 Deno v1.8.1 版本。
创建 TCP 套接字
要创建一个 TCP 服务器套接字,可以使用 Deno 的 listen
函数:
const listener = Deno.listen({ port: 8080 }); console.log("Listening on http://localhost:8080/"); for await (const conn of listener) { console.log("New client connected"); // ... }
listen
函数返回一个 net.Listener
对象,它表示一个 TCP 服务器套接字,可以使用 for await
循环来读取客户端连接。当有新的客户端连接时,可以通过 net.Conn
对象来和客户端进行通信:
// javascriptcn.com 代码示例 const listener = Deno.listen({ port: 8080 }); console.log("Listening on http://localhost:8080/"); for await (const conn of listener) { console.log("New client connected"); const buffer = new Uint8Array(1024); const n = await conn.read(buffer); console.log(`Received ${n} bytes: ${buffer.slice(0, n)}`); await conn.write(new TextEncoder().encode("Hello, world!")); conn.close(); }
在这个示例中,我们从客户端读取了一个字节数组,并发送了一个 "Hello, world!" 的消息,然后关闭了连接。
如果要创建一个 TCP 客户端套接字,可以使用 Deno 的 Dial
函数:
const conn = await Deno.connect({ hostname: "localhost", port: 8080 }); await conn.write(new TextEncoder().encode("Hello, server!")); const buffer = new Uint8Array(1024); const n = await conn.read(buffer); console.log(`Received ${n} bytes: ${buffer.slice(0, n)}`); conn.close();
在这个示例中,我们连接到 8080 端口上的服务器,并发送了一个 "Hello, server!" 的消息,然后读取了服务器返回的消息并关闭了连接。
可读性和可写性
在前面的示例中,我们使用了 read
和 write
函数来读取和写入数据,但这些函数只能读取和写入字节数组。如果要读取和写入文本数据,我们可以使用 BufReader
和 BufWriter
类来构建一个可读性和可写性更好的接口:
// javascriptcn.com 代码示例 const listener = Deno.listen({ port: 8080 }); console.log("Listening on http://localhost:8080/"); for await (const conn of listener) { console.log("New client connected"); const reader = new BufReader(conn); const writer = new BufWriter(conn); const line = await reader.readLine(); console.log(`Received: ${line}`); await writer.write(new TextEncoder().encode("Hello, world!\n")); await writer.flush(); conn.close(); }
在这个示例中,我们使用了 BufReader
和 BufWriter
来读取和写入文本行,它们可以自动处理字符串编码和缓冲区刷新等问题,并提供了更好的可读性和可写性。
异步并发
由于 Deno 是一个异步非阻塞的运行时环境,因此我们可以在一个事件循环中同时处理多个连接,以实现高效的并发处理。例如,下面的代码可以同时处理多个 TCP 客户端连接:
// javascriptcn.com 代码示例 const listener = Deno.listen({ port: 8080 }); console.log("Listening on http://localhost:8080/"); const clients = new Set<Deno.Conn>(); for await (const conn of listener) { clients.add(conn); console.log(`New client connected (${clients.size} in total)`); handleConnection(conn); } function handleConnection(conn: Deno.Conn) { const reader = new BufReader(conn); const writer = new BufWriter(conn); async function handleRequest() { const line = await reader.readLine(); console.log(`Received: ${line}`); await writer.write(new TextEncoder().encode("Hello, world!\n")); await writer.flush(); handleRequest(); } handleRequest(); }
在这个示例中,我们使用 handleConnection
函数来处理每个客户端连接,它通过递归调用 handleRequest
函数来读取和处理客户端的每一个请求。由于 handleRequest
函数是异步的,因此可以同时处理多个客户端连接。
总结
本文介绍了 Deno 中 TCP 套接字的使用方法,包括创建服务器和客户端连接、处理可读性和可写性、实现并发处理等方面。希望本文可以对初学者和使用 Deno 进行网络编程的开发者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65322c0f7d4982a6eb4753b1