Node js Socket.iO доступ к сокету снаружи для нескольких клиентов - PullRequest
0 голосов
/ 06 апреля 2020

Как мы можем получить доступ к объекту сокета снаружи для соединения с несколькими сокетами. Я создал объект глобально и попытался сделать это. Но это всегда работает для последнего подключенного сокета.

 'use strict';

const path = require('path')
const express = require('express');
const http = require('http');
const chalk = require('chalk');
const socketio = require('socket.io');
var connectionString = '';
const eventHubConsumerGroup = ""




const app = express()
const server = http.createServer(app ,() => {
    console.log(chalk.green('Server created'))
})
const io = socketio(server)

const port = process.env.port || 3000

const publicDirectoryPath  = path.join(__dirname , '../public')


var server_token = "1234567890";
app.use(express.static(publicDirectoryPath))

var localSocket;



io.on('connection',function(socket){
  localSocket = socket;
  console.log(socket.handshake.query.deviceID)
    console.log('on user connected '+socket.id);
    //report = new Report(socket);
    socket.auth = false;
    socket.on('authenticate',function(token){
        console.log('token recieved is '+token);
        if(server_token == token){
            socket.auth = true;
            console.log('connection is authenticated '+socket.id);
            socket.emit("authenticate",true);
        } else {
          console.log("Connection not established")
            socket.emit("authenticate",false);
        }
    })

    socket.on('sendSocketEvent' , message => {
        console.log(chalk.yellowBright(`Message recieved from ${socket.id} + ${message}`));
        io.to(socket.id).emit('recieveSocketEvent', `Hello test`);
    })

    socket.on('disconnect',function(){
        console.log('one user disconnected '+socket.id);
    })
    setTimeout(function(){
        if(!socket.auth){
            console.log('disconnecting the socket '+socket.id);
            socket.emit("timeOut");
            socket.disconnect();
        }
    },1000);

})







server.listen(port,() => {
    console.log(chalk.redBright(`Server is up on port ${port}`))
})



var printMessage = function (message) {
  console.log(JSON.stringify(message));
   console.log(message.DeviceId);
   if (localSocket != null){
    if (message.DeviceId == localSocket.handshake.query.deviceID) {
      localSocket.emit('recieveSocketEvent', message);
    }
   }
};



class EventHubReader {
  constructor(connectionString, consumerGroup) {
    this.connectionString = connectionString;
    this.consumerGroup = consumerGroup;
    this.eventHubClient = undefined;
    this.receiveHandlers = undefined;
  }

  async startReadMessage(startReadMessageCallback) {
    try {
      console.log(this.connectionString)
      const client = await EventHubClient.createFromIotHubConnectionString(this.connectionString);
      console.log('Successfully created the EventHub Client from IoT Hub connection string.');
      this.eventHubClient = client;

      const partitionIds = await this.eventHubClient.getPartitionIds();
      console.log('The partition ids are: ', partitionIds);

      const onError = (err) => {
        console.error(err.message || err);
      };

      const onMessage = (message) => {
        const deviceId = message.annotations['iothub-connection-device-id'];
        return startReadMessageCallback(message.body, message.enqueuedTimeUtc, deviceId);
      };

      this.receiveHandlers = partitionIds.map(id => this.eventHubClient.receive(id, onMessage, onError, {
        eventPosition: EventPosition.fromEnqueuedTime(Date.now()),
        consumerGroup: this.consumerGroup,
      }));
    } catch (ex) {
      console.error(ex.message || ex);
    }
  }

  // Close connection to Event Hub.
  async stopReadMessage() {
    const disposeHandlers = [];
    this.receiveHandlers.forEach((receiveHandler) => {
      disposeHandlers.push(receiveHandler.stop());
    });
    await Promise.all(disposeHandlers);

    this.eventHubClient.close();
  }
}




var { EventHubClient, EventPosition } = require('@azure/event-hubs');

const eventHubReader = new EventHubReader(connectionString, eventHubConsumerGroup);

(async () => {
  console.log("Step1")
  await eventHubReader.startReadMessage((message, date, deviceId) => {
    console.log("Here getting called");
    try {
      const payload = {
        IotData: message,
        MessageDate: date || Date.now().toISOString(),
        DeviceId: deviceId,
      };
      printMessage(payload);

    } catch (err) {
      console.error('Error broadcasting: [%s] from [%s].', err, message);
    }
  });
})().catch();

проблема в условии "printMessage". здесь я пытаюсь ограничить излучение на основе сокета deviceID, но он работает только для последнего подключенного сокета.

Можете ли вы помочь мне в этом.

1 Ответ

0 голосов
/ 06 апреля 2020
var localSocket;
io.on('connection',function(socket){
  localSocket = socket;
})

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

Что именно вы хотите сделать? Чтобы отправить это сообщение всем подключенным сокетам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...