基于 net.Server 和 net.Socket 的全功能 "terminal" REPL
\Full-featured "terminal" REPL over net.Server and net.Socket
这是一个关于如何使用 net.Server 和 net.Socket 运行 "full-featured"(终端)REPL 的示例。
\This is an example on how to run a "full-featured" (terminal) REPL using
net.Server and net.Socket
以下脚本在端口 1337 上启动一个 HTTP 服务器,允许客户端与其 REPL 实例建立套接字连接。
\The following script starts an HTTP server on port 1337 that allows
clients to establish socket connections to its REPL instance.
// repl-server.js import repl from 'node:repl'; import net from 'node:net'; net .createServer((socket) => { const r = repl.start({ prompt: `socket ${socket.remoteAddress}:${socket.remotePort}> `, input: socket, output: socket, terminal: true, useGlobal: false, }); r.on('exit', () => { socket.end(); }); r.context.socket = socket; }) .listen(1337);// repl-server.js const repl = require('node:repl'); const net = require('node:net'); net .createServer((socket) => { const r = repl.start({ prompt: `socket ${socket.remoteAddress}:${socket.remotePort}> `, input: socket, output: socket, terminal: true, useGlobal: false, }); r.on('exit', () => { socket.end(); }); r.context.socket = socket; }) .listen(1337);
以下代码实现了一个客户端,它可以通过端口 1337 与上述定义的服务器建立套接字连接。
\While the following implements a client that can create a socket connection
with the above defined server over port 1337.
// repl-client.js import net from 'node:net'; import process from 'node:process'; const sock = net.connect(1337); process.stdin.pipe(sock); sock.pipe(process.stdout); sock.on('connect', () => { process.stdin.resume(); process.stdin.setRawMode(true); }); sock.on('close', () => { process.stdin.setRawMode(false); process.stdin.pause(); sock.removeListener('close', done); }); process.stdin.on('end', () => { sock.destroy(); console.log(); }); process.stdin.on('data', (b) => { if (b.length === 1 && b[0] === 4) { process.stdin.emit('end'); } });// repl-client.js const net = require('node:net'); const sock = net.connect(1337); process.stdin.pipe(sock); sock.pipe(process.stdout); sock.on('connect', () => { process.stdin.resume(); process.stdin.setRawMode(true); }); sock.on('close', () => { process.stdin.setRawMode(false); process.stdin.pause(); sock.removeListener('close', done); }); process.stdin.on('end', () => { sock.destroy(); console.log(); }); process.stdin.on('data', (b) => { if (b.length === 1 && b[0] === 4) { process.stdin.emit('end'); } });
要运行此示例,请在你的计算机上打开两个不同的终端,在一个终端中使用 node repl-server.js 启动服务器,在另一个终端中使用 node repl-client.js 启动服务器。
\To run the example open two different terminals on your machine, start the server
with node repl-server.js in one terminal and node repl-client.js on the other.
来自 https://gist.github.com/TooTallNate/2209310 的原始代码。
\Original code from https://gist.github.com/TooTallNate/2209310.