【发布时间】:2020-08-31 18:41:03
【问题描述】:
.--------。 .---------。 .---------。 |客户 | ---> |服务器 A | |控制器 | '--------' '---------' '---------' .--------。 .---------。 .---------。 |客户 | |服务器 A | |控制器 | '--------' '---------' '---------' .--------。 .---------。 |客户 | ---------------------> |控制器 | '--------' '---------' .--------。 .---------。 |客户 |
我想使用nodejs同时监听两个TCP端口。一个用于客户端,另一个是控制器。首先,客户端向服务器发送认证请求。然后,服务器将带有随机数的客户端地址广播到特定端口。客户端获得随机数后,将其与自己的签名和自己的公钥一起发送给控制器。然后,控制器通过验证即将到来的公钥和随机数来检查来自客户端的数据。
但是,我必须监听两个不同的端口,而我无法在 nodejs 上使用 TCP。我怎样才能做到这一点?谢谢。
这是我的代码,
服务器部分:
const fs = require("fs");
// Get the filenames of user1 directory
dir_name = "../wallet/user1/";
const user1_info_dir = fs.readdirSync(dir_name);
// Assign specific file names on them
const user1_pub_file = dir_name + user1_info_dir[1];
// Read .pem by using "pem-file" package
const user1_pub_pem = fs.readFileSync(user1_pub_file)
const net = require('net');
const host = "127.0.0.1";
const port = 9000;
const server = net.createServer();
server.listen(port, host, () => {
console.log(`TCP Client listening on ${host}:${port}`);
});
let sockets = [];
server.on('connection', (socket) => {
var clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;
console.log(`new client connected: ${clientAddress}`);
sockets.push(socket);
// console.log(sockets);
socket.once('data', (data) => {
console.log(`Client ${clientAddress}: ${data}`);
const crypto = require('crypto');
const buf = crypto.randomBytes(256);
//console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
//Write the data back to all the connected, the client will receive it as data from the server
sockets.forEach((sock) => {
var arr = [user1_pub_pem, buf];
sock.write(Buffer.concat(arr));
});
});
// Add a 'close' event handler to this instance of socket
socket.on('close', (data) => {
let index = sockets.findIndex((o) => {
return o.remoteAddress === socket.remoteAddress && o.remotePort === socket.remotePort;
})
if (index !== -1) sockets.splice(index, 1);
sockets.forEach((sock) => {
sock.write(`${clientAddress} disconnected\n`);
});
console.log(`connection closed: ${clientAddress}`);
});
// Add a 'error' event handler to this instance of socket
socket.on('error', (err) => {
console.log(`Error occurred in ${clientAddress}: ${err.message}`);
});
});
客户端部分:
var readlineSync = require("readline-sync");
var net = require("net");
var host = "127.0.0.1";
var port = 9000;
const fs = require("fs");
const crypto = require('crypto');
dir_name = "../wallet/user1/";
const user1_info_dir = fs.readdirSync(dir_name); // Get the filenames of user1 directory
const user1_priv_file = dir_name + user1_info_dir[0]; // Assign specific file names on them
const user1_pub_file = dir_name + user1_info_dir[1];
const user1_sig_file = dir_name + user1_info_dir[2];
const user1_priv_pem = fs.readFileSync(user1_priv_file) // Read .pem by using "pem-file" package
const user1_pub_pem = fs.readFileSync(user1_pub_file)
const user1_sig_pem = fs.readFileSync(user1_sig_file)
var client = null;
function openConnection () {
if(client) {
console.log("Connection is already open --");
setTimeout(function (){
menu();
}, 0);
return;
}
client = new net.Socket();
client.on("error", function(err) {
client.destroy();
client = null;
console.log("ERROR: Connection could not be opened. Msg : %s", err.message);
setTimeout(function (){
menu();
}, 0);
});
client.connect(port, host, function () {
console.log("Connection opened succesfully");
client.write("Hello my darling !");
});
client.on("data", function (data_from_sv) {
console.log("Recieved: %s", data_from_sv);
my_ip = client.address().address;
var my_ip_buf = Buffer.from(my_ip, 'utf8');
var durT = new Date();
durT.setTime(1332403882588);
durT_str = durT.toString();
duration_time = Buffer.from(durT_str, 'utf8');
my_pub_key = user1_pub_pem;
my_prv_key = user1_priv_pem;
var arr = [data_from_sv, my_ip_buf, duration_time, my_pub_key];
var new_data = Buffer.concat(arr);
const sign = crypto.createSign('SHA256');
sign.write(new_data);
sign.end();
const signature = sign.sign(my_prv_key, 'hex');
signature_buf = Buffer.from(signature, 'utf8');
var arr2 = [signature_buf,my_pub_key];
var whole_data = Buffer.concat(arr2);
console.log(whole_data.length);
client.write(whole_data);
// sendData(data_from_sv)
setTimeout(function (){
menu();
}, 0);
});
}
function sendData(data) {
}
function menu (){
var lineRead = readlineSync.question("\n\nEnter option (1-Open, 2-Send, 3-Close, 4-Quit): ");
switch(lineRead){
case "1":
openConnection();
break;
case "2":
var data = readlineSync.question("Enter data to send: ");
sendData(data);
break;
case "3":
closeConnection();
break;
case "4":
return;
break;
default:
setTimeout(function (){
menu();
}, 0);
break;
}
}
setTimeout(function (){
menu();
}, 0);
控制器部分:
var readlineSync = require("readline-sync");
var net = require("net");
const crypto = require('crypto');
var bsplit = require('buffer-split')
var host = "127.0.0.1";
var port = 9000;
client = new net.Socket();
client.on("error", function(err) {
client.destroy();
client = null;
console.log("ERROR: Connection could not be opened. Msg : %s", err.message);
});
client.connect(port, host, function () {
console.log("Connection opened succesfully");
});
// client.once("data", function (data_from_sv) {
// sc_once_data = data_from_sv;
// console.log("Recieved: %s", sc_once_data);
// });
client.on("data", function (data_from_sv) {
console.log("Recieved: %s", data_from_sv);
});
谢谢。
【问题讨论】:
标签: javascript node.js tcp