2017-05-19 1 views
-1

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.

+0

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

+0

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

+0

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

Antwort

0

Die Kommentare von @robertklep haben mir geholfen, mein Problem zu lösen. Löschen Sie die socket.pipe (socket) -Zeile auf der Serverseite, und verwenden Sie auf der Clientseite einfach socket.write(), um eine Nachricht an den Server zu senden. Dies kann von einer socket.on-Instanz ('data') auf der Serverseite empfangen werden. Auch mit mehreren Clients zu kommunizieren, können Sie etwas schreiben wie:

var socket = {}; 

const server = tls.createServer(options, function(s){ 
    client=s.getPeerCertificate().subject.CN 
    socket[client] = s; 
    socket[client].setEncoding('utf8'); 
    socket[client].write('welcome') 

    for (key in socket){ 
    socket[key].write('new client connected') 
    } 

    socket[client].on('data',function(data){ 
    socket[client].write('data received') 
    })