Nodejs "local global var" для нового экземпляра - PullRequest
0 голосов
/ 27 апреля 2018

Сегодня я ударился об стену, когда писал TCP-сервер в узле js ... Мне нужно сделать TCP-сервер для Windows и Android-приложения: используя только сетевой модуль nodejs ... server structure ?

есть класс приложения, в котором называется класс сервера, который создает несколько экземпляров клиента. по одному на каждое соединение ... И в каждом из этих клиентских экземпляров мне нужна глобальная переменная, видимая в «текущем» экземпляре клиента ... и рекурсивно во всех других экземплярах, которая вызывается в экземпляре класса клиента.

Мне нужен этот глобальный var для хранения содержимого сеанса, такого как переменные, объекты и ключи шифрования ... для всех экземпляров, вызываемых в экземпляре класса Client, и т. Д. ... без передачи значений каждому новому экземпляру ...

//app.js
var Server = require("./core/server/Server");
console.log('hi!');
console.dir("there is nothing to look at at the momment");

global.DEBUG = true;
global.NEW_GUID = require('uuid/v4');

var server = new Server()
server.start();

//server.js
const net = require('net');
const Client = require("./Client");

class Server{
    constructor (port, address) {
        this.port = port || 4484;
        this.address = address || '127.0.0.1';
        this.clients = [];
      }
  start(callback) {
    let server = this; 
    server.connection = net.createServer((socket) => {
      socket.setEncoding("UTF8");
      let client = new Client(socket);
      server.clients.push(client);
      socket.on('error',(e)=>{ console.dir(e); })
      socket.on('end', () => {});
    });


    this.connection.listen(this.port, this.address);


  }

}
module.exports = Server;


//Client.js
//req some components
    GLOBAL_VAR = {
  login :"a",
  sess_crypt: "encryption instance setuped in client",
  socket:seocket
}
class Client {
    constructor(socket) {
      //some this vars        }
    async GetLogin() {
    }
    async GetData(d) {
    }
    StartDialog() {  
    }
    serverHandler(){
        console.log(`${this.name} connected.`);
      //client.GetLogin();
      this.socket.write("WELCOME\r\n")
      this.socket.on("data", (d) => {
        var ed = Buffer.from(d);
        console.dir(ed.toString("UTF8"));
        this.GetData(ed).then((r)=>{
          if (r.cmd == "LOGIN") {
            this.sth = new sth();
            this.sth.sth(); // inside this you can have multiple calls of sth and i can't pass any value by parameter because of rest "old" js code what was running on RHINo Java server that i can't modifi to much 
          }
        })
      })
    }
}
module.exports = Client;

    ///sth.js
//req some components
class sth extends other_staf{
  constructor() {
    this.login = GLOBAL_VAR.login
  }
  oninit(){
    // do staf start next instance of sth()
  }
  sth(){
    GLOBAL_VAR.socket.write(GLOBAL_VAR.sess_crypt("some request\r\n"))
    this.oninit();
  }
}
module.exports = sth;

1 Ответ

0 голосов
/ 27 апреля 2018

Вам не нужны глобальные переменные. Вы можете попытаться сделать что-то вроде этого, определить данные в клиенте так, например,

var client = new Client();
client.data.name = "client 1";

или лучше передать его в конструктор:

var client = new Client({name: "client 1"});

и в конструкторе

function Client(options) {
    this.data = options;
    // ...
}

и передать клиентский объект экземплярам:

var instance = new instance(client);

и доступ:

instance.client.data.name;

если этот прямоугольник, который у вас есть в проверенном изображении, находится внутри объекта, то вы можете использовать его вместо экземпляра и клиента.

...