Ich möchte Nachrichten sicher zwischen einem Client und einem Remote-Server (nur eine IP-Adresse und einen Port) mit Nodejs senden. Der Client führt eine lokale JS-Datei aus und verwendet keinen Browser. Ich habe versucht, dies mit dem Knoten TLS-Modul (https://nodejs.org/api/tls.html) zu tun.nodejs tls-Modul für Server-Client-Kommunikation ohne Browser
Der Handshake funktioniert einwandfrei, aber ich kann es nicht schaffen, eine Nachricht vom Server an den Client zu senden. Mein aktueller Code ist:
Client.js
const tls = require('tls');
const fs = require('fs');
const options = {
host: <server IP address>,
port: <port number>,
key: fs.readFileSync('client.key'),
cert: fs.readFileSync('client.crt'),
ca: fs.readFileSync('ca.crt'),
checkServerIdentity: function (host, cert) {
return undefined;
}
};
const client = tls.connect(options, function(){
if (client.authorized) {
console.log("Connection authorized");
} else {
console.log("Connection not authorized: " + conn.authorizationError)
}
process.stdin.pipe(client);
process.stdin.resume();
client.emit('data','message')
});
client.setEncoding('utf8');
client.addListener('data', function(data) {
console.log(data);
});
client.on('end',() => {
server.close();
});
server.js
const tls = require('tls');
const fs = require('fs');
const options = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt'),
ca: fs.readFileSync('ca.crt'),
requestCert: true,
rejectUnauthorized: true
};
const server = tls.createServer(options, function(socket){
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized');
socket.setEncoding('utf8');
socket.pipe(socket);
socket.emit('data','I am the server')
});
server.listen(<port number>,function(){
console.log('listening')
})
server.on('connection',function(client){
console.log('client connected')
client.on('data',function(data){
console.log(data)
})
})
Der Server Ausgang 'Client verbunden', aber nichts tun mit dem client.on() Teil und ich kann keine andere Möglichkeit finden, den Server auf Nachrichten vom Client warten zu lassen. Gibt es eine Möglichkeit, das tls-Modul zu verwenden, sodass ich den Client und den Server basierend auf den Nachrichten, die sie senden und empfangen, interagieren lassen kann? Auch hier möchte ich keinen Browser verwenden.
Um Daten zwischen den beiden Endpunkten zu senden, müssen Sie verwenden 'socket.write()', die die 'data' Ereignis auf der anderen auslösen Seite. Sie senden Rohdaten. Wenn Sie also die Nachrichten strukturieren möchten, müssen Sie diese selbst implementieren. Sie sollten wahrscheinlich "socket.pipe (socket)" loswerden, das Daten zurücksendet, die vom Client an den Client gesendet werden. – robertklep
Danke, das habe ich gebraucht. Ich möchte eine Verbindung zum Server mit zwei verschiedenen Clients herstellen. Gibt es eine Möglichkeit, auf der Serverseite festzulegen, zu welchem Client es Daten schreiben soll? Wenn ich eine Nachricht an Client A senden möchte, die beispielsweise nicht an Client B gesendet wird. – peter
Für jede Clientverbindung wird das Ereignis 'connection' ausgelöst (FWIW, Sie haben jetzt einen expliziten Listener für' connection', aber die Funktion, die Sie an 'tls.createServer()' übergeben, macht dasselbe (es ist ein impliziter Listener für) (dasselbe Ereignis). Das Argument, das Sie im Ereignishandler erhalten, stellt die Clientverbindung dar. Wenn Sie also etwas an einen bestimmten Client senden, sollten Sie 'write' auf dem Socket aufrufen, das den Client darstellt, an den Sie eine Nachricht senden möchten , wie Sie zwischen Clients unterscheiden können, müssen Sie selbst implementieren) – robertklep