1

我创建了一个 TCP 服务器来接收来自某些设备的信息,并且我想从该服务器创建一个 API,我导出了两个变量以便在 API 中使用它们。当我这样做时,我的服务器在我的另一个进程中启动,使它们同时执行,我不知道为什么会这样

//server.js

const { title, BL_url, puerto_controladores, puerto_api } = require('...')
process.title = title;

var net = require('net');

var sockets = []; 
var socketsID = [];
var lastConnected = [];


var server = net.createServer( function (socket) {

    socket.name = socket.remoteAddress + ":" + socket.remotePort;

    sockets.push(socket);
    socketsID.push(socket.name.substr(7));

    console.log(socket.name + ' connected.');

    socket.on('data', (data) => {
        textChunk = data.toString('utf8').substr(1,data.toString('utf8').length-2);
        console.log('Mensaje de ' + socket.name.substr(7) + 
    socket.on('close', () =>{
        console.log(socket.name + " desconectado.");
    });
    socket.on('error', (error) =>{
        console.log('Error del Cliente TCP: ' + puerto_controladores, error.code, error.message);
    });
    
});

server.on('error', (error) => {
    console.log('Error del Server TCP: ' + puerto_controladores, error.message);
});

server.listen(puerto_controladores, ()=>{
    setInterval(() => {
        webMethods.sendInterval();
    }, 180000);

    
    console.log("Server listening at : " + puerto_controladores);
});
//setInterval(()=>{
    module.exports = {sockets,socketsID};

另一方面:

const {sockets,socketsID} = require('..server.js');
const {titleProcess,port} = require('...');
process.title = titleProcess;
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.listen(port, () => {
    console.log('Listening at :',port);
});

app.get('/',(req,res)=>{
    console.log(test.sockets,test.socketsID);
    res.status(200).json({
        mensaje: 'received',

    })
})

无论我在 server.js 中做什么,module.export 的打印,一个新变量,包括命令提示符中的进程标题等。它在 API.js 控制台中运行

//API Output: 
Server listening at : 9006
Listening at : 4002
{ sockets: [], socketsID: [] }
{ sockets: [], socketsID: [] }

//Server Output:
Error del Server TCP: 9006 listen EADDRINUSE: address already in use :::9006
4

1 回答 1

0

nodejssocket中的对象属于特定进程。您不能轻易地与另一个进程共享它们。如果您希望一个进程在另一个进程拥有的套接字上发送数据,则使用不同的服务器将数据本身发送到另一个进程,并发送一些标识符以及接收进程可以用来确定哪个套接字的数据数据应该被发送到,然后它将通过它拥有的套接字发送数据。但是,这整件事听起来像是一种非常令人困惑的做事方式。

例如,假设您有 serverTCP(来自 server.js 的普通 TCP 服务器)和 serverAPI(来自其他文件的 Express 服务器)各自在不同的进程中。在 serverTCP 中放置一个单独的 Express 服务器,在本地端口上运行,不对外开放。当 serverAPI 接收到一些 socketID 的数据时,它会向 serverTCP 发出 http 请求并发送数据和 socketID。serverTCP 接收该 http 请求,从该请求中获取 socketID 和数据,并通过与其有连接的适当套接字将其发送出去。

仅供参考,这通常被称为代理,您的 API 在某种程度上充当真正套接字连接的代理。NPM 中有各种各样的模块也可以实现实际的代理。

于 2021-06-11T21:53:01.890 回答