2017-05-19 3 views
-1

nodejsを使用して、クライアントとリモートサーバー(単にIPアドレスとポート)間でメッセージを安全に送りたいとします。クライアントはローカルの.jsファイルを実行し、ブラウザは使用しません。私はノードTLSモジュール(https://nodejs.org/api/tls.html)を使ってそうしようとしました。nodejs tlsブラウザなしのサーバーとクライアントの通信のためのモジュール

ハンドシェイクは正常に機能しますが、サーバーからクライアントにメッセージを送信できません。私の現在のコードは次のとおりです。

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) 
    }) 
}) 

サーバが出力する 'クライアント接続' を行いますがclient.on()の部分で何もしません私はサーバーがクライアントからのメッセージを聞くための別の方法を見つけることができません。 tlsモジュールを使用して、クライアントとサーバーが送受信するメッセージに基づいて対話できるようにする方法はありますか?繰り返しますが、私はブラウザを使いたくありません。

+0

は、2つのエンドポイント間でデータを送信するには、 '他に' data'イベントをトリガしますsocket.writeを() 'を使用する必要があります側。未処理のデータを送信しているので、メッセージを何らかの方法で構造化したい場合は、それを自分で実装する必要があります。クライアントのクライアントから送信されたデータを返す 'socket.pipe(socket)'を削除するべきでしょう。 – robertklep

+0

ありがとう、それは私が必要なものです。私は2つの異なるクライアントとサーバーに接続したいと思います。どのクライアントにデータを書き込まなければならないのか、サーバー側で特定する方法はありますか?たとえば、クライアントBに送信されない可能性のあるメッセージをクライアントAに送信する場合。 – peter

+0

クライアント接続ごとに、 'connection'イベントが発生します(FWIW、' connection'の明示的なリスナーがありますが、 'tls.createServer()'に渡す関数は同じです)同じイベント)イベントハンドラで受け取る引数はクライアント接続を表しているので、特定のクライアントに何かを送る場合は、メッセージを送信するクライアントを表すソケットで 'write'を呼び出す必要がありますどのようにクライアントを区別できるかは、自分で実装する必要があるものです) – robertklep

答えて

0

@robertklepによるコメントは私の問題を解決するのに役立ちました。サーバー側のsocket.pipe(ソケット)行を削除し、クライアント側ではsocket.write()を使用してサーバーにメッセージを送信します。これは、サーバー側のsocket.on( 'data')インスタンスによって受け取ることができます。同様にまた、複数のクライアントと対話するために、あなたが何かを書くことができます。

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') 
    }) 
関連する問題