gpt4 book ai didi

node.js - nodejs tls 模块,用于无需浏览器的服务器-客户端通信

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:25 25 4
gpt4 key购买 nike

我希望使用 nodejs 在客户端和远程服务器(只是一个 IP 地址和一个端口)之间安全地来回发送消息。客户端运行本地 .js 文件,不使用浏览器。我尝试使用 Node TLS 模块 ( https://nodejs.org/api/tls.html ) 这样做。

握手工作正常,但我无法设法从服务器向客户端发送消息。我当前的代码是:

客户端.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();
});

服务器.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 模块,以便我可以让客户端和服务器根据它们发送和接收的消息进行交互?同样,我不想使用浏览器。

最佳答案

@robertklep 的评论帮助我解决了我的问题。删除服务器端的 socket.pipe(socket) 行,在客户端只需使用 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')
})

关于node.js - nodejs tls 模块,用于无需浏览器的服务器-客户端通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com