为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2022-08-18 15:52:05
真正让我确信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);}它很好,很紧凑,但我无法使用 和 方法将此示例转换为 TCP 聊天服务器。任何帮助将不胜感激!我也认为这将是一个有用的例子添加到网站。Deno.Connreadwrite
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

使用 Deno.listen 创建服务器,使用 Deno.connect 连接到该服务器。

服务器/客户端的一个简单示例是:tcp

服务器.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();


您可以从此处进行构建。对于聊天服务器,您将保持连接打开状态,并发送多条消息。


查看完整回答
反对 回复 2022-08-18
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

好吧,经过更多的尝试,这是我的TCP聊天服务器:


const server = Deno.listen({ port: 8000 });

console.log("tcp server listening on port 8000");


const connections: Deno.Conn[] = [];


for await (const connection of server) {

  // new connection

  connections.push(connection);

  handle_connection(connection);

}


async function handle_connection(connection: Deno.Conn) {

  let buffer = new Uint8Array(1024);

  while (true) {

    const count = await connection.read(buffer);

    if (!count) {

      // connection closed

      const index = connections.indexOf(connection);

      connections.splice(index, 1);

      break;

    } else {

      // message received

      let message = buffer.subarray(0, count);

      for (const current_connection of connections) {

        if (current_connection !== connection) {

          await current_connection.write(message);

        }

      }

    }

  }

}

代码看起来与 Node 版本完全不同。也就是说,TCP不维护消息边界,Deno版本通过读取缓冲区来明确这一点。这类似于 Rust 和模块处理 TCP 的方式。实际上,我不太确定事件在Node中代表什么;它似乎只是来自TCP流的任意长度的数据片段。Uint8Arraystd::nettokio::netsocket.on('data')


查看完整回答
反对 回复 2022-08-18
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号