Deno 是一个安全、简单且现代化的 TypeScript 运行时,可以直接执行 JavaScript 和 TypeScript 代码。它有着很多优点,比如支持 ES6+ 的语法和模块化,内置了 TypeScript 编译器,支持多平台使用等。在这篇文章中,我们将介绍如何使用 Deno 进行 TCP 编程。
什么是 TCP 编程
TCP 是传输控制协议(Transmission Control Protocol)的简称,是一种网络传输协议,它是一种可靠、面向连接(即建立连接后才能传输数据)、点对点的传输协议。TCP 可以在网络上提供高可靠性、高通量传输服务。而 TCP 编程就是利用 TCP 协议进行网络数据的传输与接收。
Deno 内置了 Deno.listen()
和 Deno.connect()
函数,可以方便地进行 TCP 编程。下面我们将讲解如何使用这两个函数来实现一个简单的聊天室系统。
创建服务器
首先我们需要创建一个服务器,让客户端和它进行连接,以便进行通信。
// javascriptcn.com 代码示例 // 接收一个 TCP 连接,打印客户端地址,并向客户端发送欢迎消息 async function handle(conn: Deno.Conn) { const remoteAddr = conn.remoteAddr; console.log(`new client: ${remoteAddr.hostname}:${remoteAddr.port}`); await conn.write(new TextEncoder().encode("welcome to chat room\n")); // 读取所有客户端发送的消息,并广播给其他客户端 const buf = new Uint8Array(1024); while (true) { const nbytes = await conn.read(buf); if (nbytes === null) { console.log(`${remoteAddr.hostname}:${remoteAddr.port} disconnected`); break; } const msg = new TextDecoder().decode(buf.subarray(0, nbytes)); console.log(`${remoteAddr.hostname}:${remoteAddr.port} says: ${msg}`); broadcast(conn, msg); } } // 广播接收到的消息给所有客户端 function broadcast(conn: Deno.Conn, message: string) { for (const c of clients) { if (c != conn) { c.write(new TextEncoder().encode(message)); } } } // 启动服务器,监听端口 8080 const listener = Deno.listen({ port: 8080 }); console.log("Chat server is started on 0.0.0.0:8080"); // 保存所有客户端连接 const clients: Deno.Conn[] = []; // 接收客户端连接,并保存客户端连接到 clients 数组中 for await (const conn of listener) { clients.push(conn); handle(conn); }
这段代码创建了一个 TCP 服务器,并监听在本地 8080 端口上。当有客户端连接时,它会打印客户端地址,并发送欢迎消息。然后会无限循环读取客户端发送的消息,并在接收到消息后广播给其他客户端。所有客户端连接会保存在一个数组中。
创建客户端
接下来我们需要创建一个客户端,并将其连接到服务器上。
// javascriptcn.com 代码示例 // 连接服务器 const addr = { hostname: "localhost", port: 8080 }; const conn = await Deno.connect(addr); console.log("Connected to chat server"); // 读取并打印服务器发送的欢迎消息 const buf = new Uint8Array(1024); await conn.read(buf); console.log(new TextDecoder().decode(buf)); // 读取用户输入,并发送给服务器 const stdin = Deno.stdin; console.log("Start to chat, type anything and hit enter..."); for await (const line of readLines(stdin)) { await conn.write(new TextEncoder().encode(line + "\n")); }
这段代码创建了一个 TCP 客户端,并连接到服务器。首先会读取服务器发送的欢迎消息,并打印出来。然后它会等待用户输入,在输入后将该消息发送给服务器进行广播。
运行聊天室系统
通过上面的代码,我们已经成功地创建了一个聊天室系统。我们可以启动服务器,同时启动多个客户端,并在客户端之间进行通信。在这里,我们展示一个同时启动两个客户端进行聊天的示例:
打开两个控制台窗口,分别输入以下命令:
deno run --allow-net chatroom/server.ts deno run --allow-net chatroom/client.ts
然后,输入一些文字并回车,即可在客户端之间进行通信。
总结
本文介绍了如何使用 Deno 进行 TCP 编程,实现了一个简单的聊天室系统。通过本文的学习,读者可以了解到 Deno 的基本使用方法,并了解 TCP 编程的基本知识。希望本文对读者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653362317d4982a6eb6e8a2d