IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Requête UDP et routage de requête


Sujet :

NodeJS

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 47
    Points
    47
    Par défaut Requête UDP et routage de requête
    Bonjour à tous,

    je voudrais mettre en place un panel d'administration pour un serveur de jeu mais j'ai un peu de mal a voir comment je peux l’implémenter.

    J'ai pour l'instant un module dans nodejs qui récupère les infos du server via le serveur query de steam.

    Je pensais utiliser le système de routage de NodeJs (express) ex : www.domain.xyz/serverinfo qui exécuterait mon script et renverrait la réponse au format JSON ce json serait alors utiliser au niveau du script du navigateur via une requête ajax.

    Comment puis-je modifier mon script pour qu'il renvoie sa réponse lorsqu'il a terminer de récupérer les données ?

    Si vous avez des conseils n'hésiter pas

    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    var dgram = require('dgram');
    var fs = require('fs');
    var serverArray;
    var buffer = new Buffer([0xff,0xff,0xff,0xff,0x54,0x53,0x6f,0x75,0x72,0x63,0x65,0x20,0x45,0x6e,0x67,0x69,0x6e,0x65,0x20,0x51,0x75,0x65,0x72,0x79,0x00]); // A2S_INFO Query
     
    //Lecture de ma liste de serveur
    function readJson(){
    fs.readFile('server.json', 'utf8', function (err,data) {
    	if (err) {
        	return console.log(err);
      	}
     	else{
      		var json = JSON.parse(data);
      		serverArray = new Array(json.length);
      		for (var k =0 ; k < json.length ; k++){
      			new aQuery(json[k][0],json[k][1],k); // Genere une query pour chaque serveur
      		};
     	}
    });
    }
     
    var server = function (){
    	this.servername;
    	this.map;
    	this.folder;
    	this.game;
    	this.idserver;
    	this.player;
    	this.maxplayer;
    	this.bots;
    	this.serverType;
    	this.environment;
    	this.visibity;
    	this.vac;
    	this.serverversion;
    	this.serverport;
    	return this;
    }
     
    var aQuery = function(dIp, dPort, dId){
    var socket = dgram.createSocket("udp4");
    var timerout = "";
    socket.on('message',function (message, remote){
    	console.log("Receiving ...");
    	clearTimeout(timerout);
    	var json = message.toJSON()
    	parseInfo(json['data'],dId);
    	socket.close();
    });
    socket.send(buffer,0,buffer.length,dPort,dIp,function(err){
    	timerout = setTimeout(function() {socket.close();console.log("TimeOut exceeded");}, 2000); // Création d'un timeout au cas ou le serveur n'est pas joignable
    });
     
    function parseInfo(data, did){
    	var srv = new server();
    	getProtocol(data);
    	srv.servername = getString(data);
    	srv.map = getString(data);
    	srv.folder = getString(data);
    	srv.game = getString(data);
    	srv.idserver = getShort(data);
    	srv.player = getByte(data);
    	srv.maxplayer = getByte(data);
    	srv.bots = getByte(data);
    	srv.serverType = getServerType(data);
    	srv.environment = getEnv(data);
    	srv.visibity = getVisibility(data);
    	srv.vac = getIsSecured(data);
    	srv.serverversion = getString(data);
    	data.shift();
    	srv.serverport = getShort(data);
    	serverArray[did] = srv;
    }
     
    // Fonctions de parsing des données
    function getProtocol(mes){
    	for (var i = 1; i <= 6; i++) {
    			mes.shift();
    	};
    }
     
    function getString(mes){
    	var output="";
    	while(mes[0] != '0')
    	{
       	output += String.fromCharCode(mes.shift());
    	}
    	mes.shift();
    	return output;
    }
     
    function getByte(mes){
    	var output="";
    	output += mes.shift();
    	return output;
    }
     
    function getShort(mes){
    	var output=0;
    	var buffer = new Buffer(2);
    	buffer[0] = mes.shift();
    	buffer[1] = mes.shift();
    	output = buffer.readInt16LE(0);
    	return output;
    }
     
    function getServerType(mes){
    	var serverType = "";
    	var type = getByte(mes);
    	if(type == 100) {
    		serverType = "Dedicaced";
    	}
    	return serverType;
    }
     
    function getEnv(mes){
    	var environment = "";
    	var byte = getByte(mes);
    	if (byte == 108){
    		environment = "Linux";
    	}
    	return environment;
    }
     
    function getVisibility(mes) {
    	return (getByte(mes)==0) ? "Public" : "Private";
     
    }
    function getIsSecured(mes) {
    	return (getByte(mes)==0) ? "Unsecure" : "Secure";
    }
     
    }
    //Fonction d'appel pour ma route
    exports.getServerInfo = function () {
      readJson();
      return serverArray;
    };

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Bonjour,

    Renvoyer un objet au format json via express : http://expressjs.com/api.html#res.json

    Mais je ne suis pas sur de comprendre la question qui est ambigue :

    Comment puis-je modifier mon script pour qu'il renvoie sa réponse lorsqu'il a terminer de récupérer les données ?
    Lorsque tu l'exécutes, ton module fonctionne-t-il (je l'ai lu en diagonale, et j'ai quelques réserves ) ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 47
    Points
    47
    Par défaut
    En gros quand j'appelle ma méthode getServerInfo() (de mon script de query) dans mon routeur le soucis est qu'il retourne mon array avant que les réponses des requêtes y soit insérées dans lors que je vais sur le site la première fois j'ai {null,null,...} et la seconde fois j'ai mon tableau mais de ma première requete. donc comment faire pour que le tableau soit retourné seulement quand les query UDP soit terminée ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    c'est bien ce qu'il me semblait... ton premier problème vient du fait que tu fais une boucle sur un callback... bienvenue dans le monde de l'asynchrone
    je pourrais te pondre le truc, mais il y a un certain nombre de concept à avaler avant si tu veux comprendre ce que tu fais, et surtout c'est ce qui fait la spécificité de node, ce serais dommage de passer à coté. Tu peux donc déjà fouiller sur le net pour la notion de boucle avec un callback et regarder du coté de async.js, une lib qui te facilite la vie sur le sujet (indispensable en fait).

Discussions similaires

  1. Formulez des requêtes udp en hexadécimal.
    Par NoRKi dans le forum Web
    Réponses: 5
    Dernier message: 16/04/2007, 16h15
  2. [Requête]Résultat capricieux d'une requête
    Par Heureux-oli dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/04/2007, 09h36
  3. [Requête]liste déroulante dans un requête
    Par Neilime05 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/03/2007, 12h30
  4. [Requête] Avoir zéro pour une Requête vide
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 10/01/2007, 03h35
  5. Réponses: 2
    Dernier message: 24/08/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo