javascript - 如何用 Deno 编写 TCP 聊天服务器?
问题描述
真正让我相信 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.Conn
'sread
和write
方法将这个示例变成 TCP 聊天服务器。任何帮助将非常感激!我也认为这将是添加到网站的有用示例。
解决方案
用于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();
您可以从这里构建。例如,对于聊天服务器,您将保持连接打开,并发送多条消息。
推荐阅读
- python - 对添加到 stripplot 的 errorbar() 的查询
- css - 如何实现响应式砌体式布局,它是连续的并且没有间隙?
- cassandra - 破译丢弃的突变消息
- oop - fortran 2003 中的内存泄漏
- python - 尝试了 NoReverseMatch 1 个模式:['PUTData/(?P
[0-9]+)/$'] - c# - 如何将多个调用(通过 AJAX)排队到 FileStream / StreamWriter?
- r - 使用 Rattle 创建的决策树具有非常高的根节点错误
- ffmpeg - 多输入多输出 ffmpeg 命令中的截断视频
- r - 如何从 R 数据框中特定行的上方和下方提取行?
- celery - 气流芹菜工人崩溃,无法完成任务