javascript - 如何用 Deno 编写 TCP 聊天服务器?

标签 javascript node.js tcp chat deno

真正让我相信 Node 的强大功能的演示之一是 Ryan Dahl 在此视频中展示的简单 TCP 聊天服务器:https://www.youtube.com/watch?v=jo_B4LTHi3I&t=28m23s

演示中的代码如下所示:

const net = require('net');
const server = net.createServer();

const sockets = [];

server.on('connection', (socket) => {
  sockets.push(socket);

  socket.on('data', (message) => {
    for (const current_socket of sockets) {
      if (current_socket !== socket) {
        current_socket.write(message);
      }
    }
  });

  socket.on('end', () => {
    const index = sockets.indexOf(socket);
    sockets.splice(index, 1);
  });
});

server.listen(8000, () => console.log('tcp server listening on port 8000'));

我在 Deno 网站上找到的唯一 TCP 示例是一个回显服务器,如下所示:

const listener = Deno.listen({ port: 8080 });
console.log("listening on 0.0.0.0:8080");
for await (const conn of listener) {
  Deno.copy(conn, conn);
}

又好又紧凑,但我一直无法使用Deno.Connreadwrite把这个例子变成 TCP 聊天服务器的方法。任何帮助将非常感激!我也认为这将是添加到网站的有用示例。

最佳答案

使用 Deno.listen 创建服务器和 Deno.connect 连接到该服务器。
tcp 的一个简单示例服务器/客户端将是:

server.js

const encoder = new TextEncoder();
const decoder = new TextDecoder();

const listener = Deno.listen({ port: 8080 });

console.log("listening on 0.0.0.0:8080");
for await (const conn of listener) {
  // Read message
  const buf = new Uint8Array(1024);
  await conn.read(buf);
  console.log('Server - received:', decoder.decode(buf))
  // Respond
  await conn.write(encoder.encode('pong'))
  conn.close();
}

客户端.js

const encoder = new TextEncoder();
const decoder = new TextDecoder();

const conn = await Deno.connect({ hostname: "127.0.0.1", port: 8080 })
// Write to the server
await conn.write(encoder.encode('ping'));
// Read response
const buf = new Uint8Array(1024);
await conn.read(buf);
console.log('Client - Response:', decoder.decode(buf))
conn.close();


您可以从这里构建。例如,对于聊天服务器,您将保持连接打开,并发送多条消息。

关于javascript - 如何用 Deno 编写 TCP 聊天服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61840308/

相关文章:

javascript - 在 Google Apps 脚本中返回具有合并列的某些行的范围

javascript - MongoDB/Express : Why does Array. 包括返回 false 而不是 true?

linux - tcp连接中的序列号在什么情况下环绕

客户端/服务器 : Integer always received as 1 (C-programming)

javascript - Uncaught ReferenceError : $ is not defined in webpack 4

javascript - 如何使用 Node.js 运行用 js 编写的服务器

javascript - 在 MongoDB 的 Node.js 中链接多个 promise 函数

macOS NKE ipf_filter – IP 校验和为 0

javascript - getBoundingClientRect() 内 »溢出 :scroll«

javascript - 网络 Storm : Different JS language versions in different scopes