【发布时间】:2021-12-03 23:34:34
【问题描述】:
我正在使用 net 模块创建侦听器,但遇到了一些问题。我试图让它等到它完成将“文本”写入客户端,然后客户端才能再次键入。如果我不这样做并且我坚持输入它只会让你能够在导致奇怪格式等的文本之间写入输入。
那么我怎样才能让它等到它被写入客户端呢?
代码:
const net = require('net');
const server = new net.Server();
server.on('connection', async function (socket) {
console.log("Client connected!");
socket.on('data', async function (data) {
socket.setEncoding('utf8');
let input = data.toString().replace(/(\r\n|\n|\r)/gm, "");
if (input == "echo")
socket.write("$ ");
else
socket.write("invalid command");
});
});
server.listen(1337, function() {
console.log("listening");
});
图片: https://imgur.com/a/lc21Y13
编辑: 这是在本地主机上,假设我将它托管在服务器上,所以会有更高的 ping 它更糟糕。
编辑: 这是托管在服务器上时的图片: https://imgur.com/a/LIKRRr9
编辑: 我试过用 SSH 代替 telnet 和 raw,现在得到了基本相同的结果。
图片: https://imgur.com/a/XJmpGSa
代码:
var fs = require('fs');
var username = null;
var ssh2 = require('ssh2');
new ssh2.Server({
hostKeys: [fs.readFileSync('ssh.key')]
}, function (client) {
console.log('Client connected!');
client.on('authentication', function (ctx) {
if (ctx.method !== 'password') return ctx.reject(['password']);
if (ctx.method === 'password') {
username = ctx.username;
console.log(username);
console.log(ctx.password);
ctx.accept();
}
else {
console.log("rejected.");
ctx.reject();
}
}).on('ready', function () {
console.log('Client authenticated!');
client.on('session', function (accept, reject) {
var session = accept();
session.once('shell', function (accept, reject, info) {
var stream = accept();
stream.write("$ ");
stream.on('data', function (data) {
var args = data.toString().split(" ");
console.log(args);
switch (args[0]) {
case "echo":
args.shift();
stream.write(args.join(" ") + "\r\n");
break;
case "whoami":
stream.write(username + "\r\n");
break;
case "exit":
stream.exit(0);
stream.end();
stream = undefined;
break;
default:
stream.stderr.write(args[0] + ": No such command!\r\n");
break;
}
if (typeof stream != 'undefined') {
stream.write("$ ");
}
});
});
});
}).on('end', function () {
console.log('Client disconnected');
});
}).listen(1337, function () {
console.log('Listening on port ' + this.address().port);
});
【问题讨论】:
-
不看任何代码就很难分辨。
-
编辑了帖子。
-
你如何想象一个阻止用户按键的程序?强大的力反馈?电击?
-
我见过一些项目,当您输入垃圾邮件时它不会“出错”。我以为它一直等到它把数据写给用户,然后允许你再次在你的客户端中写,但我猜我错了。