NodeJS net.socket Pipe по условию/фильтру
Я новичок в NodeJS. Существующий канал net.socket необходимо фильтровать по условию, чтобы не подключаться к «con2», мой существующий код выглядит следующим образом.
Я нашел методы Transform и PipeLine, и пока я пробовал, пример кода еще не работает для моего сценария.
Условие: в данных потока чтения "con1" есть ключевое слово. например "Вывод" Затем не подключать или преобразовывать данные как пустые в "con2". Так что, "con2" не обрабатывать.
Start.js
import Proxy from "./Proxy.js";
const proxy = Proxy();
proxy.listen('4000');
Прокси.js
import net from "net";
export default () =>
net.createServer((con1) => {
const con2 = net.connect(
'1234',
'127.0.0.1'
);
con1.pipe(con2).pipe(con1);
con2.on("data", async (data) => {
try {
console.log("sent from con2:", data);
}
}
}
con1.on("data", async (data) => {
try {
console.log("sent from con1:", data);
}
}
}
Пожалуйста, помогите советом. Заранее большое спасибо.
1 ответ
Я кое-что собрал:
const net = require("net");
const { Transform, pipeline } = require("stream");
const spy = (client) => {
return new Transform({
transform(chunk, encoding, cb) {
if (chunk.toString("utf-8").includes("output")) {
cb(new Error("ABORTED!"));
} else {
cb(null, chunk);
}
}
});
};
let server = net.createServer((socket) => {
const client = net.connect('1234', '127.0.0.1');
pipeline(socket, spy(client), client, (err) => {
console.log("pipeline closed", err);
});
});
server.listen(1235, "127.0.0.1", () => {
console.log("Go and send something to the tcp socket, tcp://127.0.0.1:1235")
});
Запустим простой сервер netcat, чтобы посмотреть, что мы туда отправляем:
while true; do nc -l -p 1234; done;
Теперь, когда мы подключаемся к другому netcat, мы можем отправлять данные через прокси другому экземпляру netcat:
nc 127.0.0.1 1235
Когда мы теперь отправляем ключевое слово «output», соединение прерывается/завершается.
Шпионские функции просто проверяют фрагмент, который проходит через поток преобразования в конвейере, и проверяет строку «выход», если она найдена, конвейер закрывается, и оба клиентских сокета/соединения разрываются.