JeuWeb - Crée ton jeu par navigateur
[Node.js] Utilisation de Socket.IO - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Node.js] Utilisation de Socket.IO (/showthread.php?tid=5897)

Pages : 1 2 3 4 5


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 31-12-2011

Pourquoi ce JSON.stringify dans app.html ? Ici on ne renvoit pas du JSON mais un code source, l'erreur vient surement de là.
Aussi, le path doit commencer par '/' Wink

Correction :

app.html

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect();
socket.on('divContents', function (data) {
//console.log(data);
document.getElementById('event').innerHTML = data;
});

</script>
</head>
<body>
<div id='event'></div>
</body>
</html>

app.js

Code :
// Serveur
var html = require('fs').readFileSync(__dirname+'/app.html');
var http = require('http');

var app = http.createServer(function(req, res){ res.end(html); });
app.listen(8080);

var io = require("socket.io");
var io = io.listen(app);

io.sockets.on('connection', function (socket) {
var options = {
host: 'localhost',
port: 80,
path: '/FUCORE/php/evenement.php',
method: 'GET'
};

var req = http.request(options, function(res) {
res.on('data', function (contents) {
socket.emit('divContents', contents);
});
});

req.end();
});

Si ça ne marche pas vérifie bien que http://localhost/FUCORE/php/evenement.php renvoit bien ce que tu veux.


RE: [Node.js] Utilisation de Socket.IO - Maks - 31-12-2011

J'avais testé un petit JSON.stringify parce qu'avec cet exemple il me renvoyait "[object Object]", ce qu'il fait toujours :/

Il me semble que pour var socket = io.connect(); on peut mettre var socket = io.connect('http://127.0.0.1:8080');
Peut être que ça peut m'aider ^^

J'essaie de chercher, mais y'a pas tant de tutos même en anglais et la doc est vachement basique... Sad


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 31-12-2011

"The 'data' event emits either a Buffer (by default) or a string if setEncoding() was used." Oups :-°

Correction :


// Serveur
var html = require('fs').readFileSync(__dirname+'/app.html');
var http = require('http');

var app = http.createServer(function(req, res){ res.end(html); });
app.listen(8080);

var io = require("socket.io");
var io = io.listen(app);

io.sockets.on('connection', function (socket) {
var options = {
host: 'localhost',
port: 80,
path: '/FUCORE/php/evenement.php',
method: 'GET'
};

var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (contents) {
socket.emit('divContents', contents);
});
});

req.end();
});



RE: [Node.js] Utilisation de Socket.IO - Maks - 31-12-2011

Bien vu Smile

Et en rajoutant ceci à mon index.php

Code :
<script type="text/javascript" src="/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script>
<script type="text/javascript">
       var socket = io.connect('http://127.0.0.1:8080');
    socket.on('divContents', function (data) {
         alert(data);
    });
</script>

Je reçois bien le contenu de evenement.php sans m'emmerder avec app.html Smile

Ca semble purement statique par contre pas d'actualisation en temps réel :/

De plus, j'utilise une variable de session dans evenement.php et malgré le session_start(); il n'en retrouve pas la valeur


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 31-12-2011

Pour une actualisation en temps reel il faut que tu demandes au serveur de te renvoyer l'événement, pour cela il faut lui donner toi même un événement. Sinon c'est sur qu'il va pas décider tous seul de t'envoyer le contenu Big Grin

Exemple :

var html = require('fs').readFileSync(__dirname+'/app.html');
var http = require('http');

var app = http.createServer(function(req, res){ res.end(html); });
app.listen(8080);

var io = require("socket.io");
var io = io.listen(app);

io.sockets.on('connection', function (socket) {
socket.on('giveDivContents', function() {
var options = {
host: 'localhost',
port: 80,
path: '/FUCORE/php/evenement.php',
method: 'GET'
};

var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (contents) {
socket.emit('divContents', contents);
});
});

req.end();
});
});

Code :
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>
        <script type="text/javascript">
        var socket = io.connect();
        socket.on('divContents', function (data) {
            //console.log(data);
            document.getElementById('event').innerHTML = data;
        });
        
        setInterval( function() { socket.emit('giveDivContents'); }, 1000);
        </script>
    </head>
    <body>
        <div id='event'></div>
    </body>
</html>

Après pour les sessions c'est un peu normal en faite, là tu passes par l'intermediaire d'un serveur, le serveur n'a pas le cookie de session de l'utilisateur. Il n'y a pas trente six solution pour cela,il faut soit passer l'id de session au serveur qui lui même le donnera à ta page qui pourra charger la bonne session, soit faire autrement.

Lien relatif aux ids de sessions en PHP : http://www.php.net/manual/fr/function.session-id.php


RE: [Node.js] Utilisation de Socket.IO - Maks - 31-12-2011

Ouep ^^ donc j'ai essayé ça :

Code :
// Serveur
var http = require('http');

var app = http.createServer(function(req, res){  });
app.listen(8080);

var io = require('socket.io');
var io = io.listen(app);

io.sockets.on('connection', function (socket) {
    var options = {
        host: 'localhost',
        port: 80,
        path: '/FUCORE/php/evenement.php',
        method: 'GET'
    };

    var req = http.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function (contents) {
            socket.emit('divContents', contents);
            socket.on('callback', function () {
                 socket.emit('divContents', contents);
            });
        });
    });

    req.end();
});

Code :
// Client

    var socket = io.connect('http://127.0.0.1:8080');
    
    socket.on('divContents', function (data) {
        document.getElementById('divSupportEvent').innerHTML = data;
        socket.emit('callback');
    });

Ca marche mais il me renvoie toujours la même page comme si elle était mise en cache (il faut refaire l'HTTP.request peut etre ?)

Pour les sessions PHP visiblement faut voir du côté des cookies
Plutôt :

Code :
var http = require('http');

var app = http.createServer(function(req, res){  });
app.listen(8080);

var io = require('socket.io');
var io = io.listen(app);

io.sockets.on('connection', function (socket) {
    var options = {
        host: 'localhost',
        port: 80,
        path: '/FUCORE/php/evenement.php',
        method: 'GET'
    };

    var req = http.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function (contents) {
            socket.emit('divContents', contents);
        });
    });

    req.end();

    socket.on('callback', function () {
        var req = http.request(options, function(res) {
            res.setEncoding('utf8');
            res.on('data', function (contents) {
                socket.emit('divContents', contents);
            });
        });

        req.end();
    });

});

Et ça marche ^^

Plus qu'à gérer la session PHP Smile


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 31-12-2011

Cf mon post juste au dessus où je donne le code. Car effectivement si tu ne redemandes pas le contenu de la page par HTTP il ne va pas te la changer tous seul comme un grand.

Pour les sessions pas besoin des cookies, il faut juste passer l'id de session au serveur Node.JS ( lors de l'appel de l'événement giveDivContents ) qui lui même le donnera à ta page PHP qui n'aura plus qu'à faire un appel à session_id pour utilliser la bonne session.


RE: [Node.js] Utilisation de Socket.IO - Maks - 31-12-2011

Autant pour moi je n'avais pas vu l'édit de ton post au dessus ! ^^

Ta solution marche aussi, mais je préfère qu'il lance le callback une fois le contenu reçu plutôt qu'avec un setInterval qui va m'imposer une latence d'1s ^^

Pour les sessions j'avais trouvé :

Code :
/** File system library **/
var fs = require('fs');

/** Extract the session id from the headers cookies **/
function getPHPSessionId(cookies) {
    var phpSessionId = '';
    cookies.split(';').forEach(function(a) {
        var b = a.split('=');
        if(b[0].trim() == 'PHPSESSID') {
            phpSessionId = b[1].trim();
        }
    });

    return phpSessionId;
}

/**
* This function will look in the PHP Session directory and look for the session
* file.  If the file exists it will load that file as a string and then parse
* that string for the PHP Session which will only be stored once the PHP authorization
* method saves it.
*/
function authorizePHPSession(phpSessionId, cb) {
    try {
        fs.readFile('../tmp/sess_'+phpSessionId, 'utf8', function(err, data) {
            if(err) {
                throw err;
            }

            if(data.search(phpSessionId.toString()) > -1) {
                cb(null, true);
            } else {
                cb(null, false);
            }
        });
    } catch(e) {
        cb(null, false);
    }
}

io.configure(function() {
    io.set('transports', ['xhr-polling','htmlfile','jsonp-polling']);
    io.set('authorization', function (data, cb) {
        authorizePHPSession(getPHPSessionId(data.headers.cookie), cb);
    });
});

Mais il me dis que cookies est indéfini.

Ta solution si j'ai bien compris ressemblerait à :

socket.emit('callback', '<?php session_id(); ?>');

puis path: '/FUCORE/php/evenement.php?PHPSESSID=' + id,

?


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 31-12-2011

Non la variable ne serait pas mis dans le path mais sinon oui c'est ça ( Pour passer une variable dans une requete GET, il faut écrire dans req avec write, enfin ... Je n'en suis aucunement sûr ). Concernant les cookies je ne serais pas te dire vu que je n'ai jamais utilisé les cookies avec Node.JS mais la méthode pour les récupérer à du changer par rapport au code que tu as trouvé. ( http://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server ) A toi d'adapter ton précédent code avec le code de ton serveur actuel et ce qui est dit dans ce topic Wink

Concernant ton callback, tu voudrais donc que le serveur une fois une requete HTTP executé et le contenu renvoyé fasse de lui même une nouvelle fois cette action ? Sans demande de la part du client donc ?


RE: [Node.js] Utilisation de Socket.IO - Maks - 31-12-2011

J'ai rajouté ça pour le moment à mon code serveur :

Code :
var app = http.createServer(function(req, res){  
    // To Get a Cookie
  var cookies = {};
  req.headers.cookie && req.headers.cookie.split(';').forEach(function( cookie ) {
    var parts = cookie.split('=');
    //cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
    if(parts[0].trim() == 'PHPSESSID') {
        phpSessionId = parts[1].trim();
    }
  });

  // To Write a Cookie
  res.writeHead(200, {
    'Set-Cookie': 'PHPSESSID='+phpSessionId,
    'Content-Type': 'text/plain'
  });
});

Code :
Concernant ton callback, tu voudrais donc que le serveur une fois une requete HTTP executé et le contenu renvoyé fasse de lui même une nouvelle fois cette action ? Sans demande de la part du client donc ?

Tout à fait, si tu veux la page evenement va chercher dans mysql les évènements genre "vous avez infligé autant de dégat", "machin t'as invité dans un chat privé". Ca se présente comme ça : http://img576.imageshack.us/img576/7922/17668206.png

Après je dois faire la même chose pour le chat sauf que cette fois il y aura du POST et des ID à gérer pour le chat privé.
Puis le plus dur les déplacements.

Le reste comme les menus peut rester en AJAX vu que j'ai pas besoin d'actualisation en temps réel Smile