Wie man Apache und Node.js mit Sockel.io setup arbeiten?

Nur beginnend mit Knoten.js/Socket.io. Letztlich will ich zu dienen die Seiten von Apache beim drücken, und verstärkt einige der Inhalte mit Node.js server. Dies ist nur ein kleiner test, um zu sehen, wie es funktioniert. Hier ist mein setup:

  • Apache läuft auf port 8080
  • Node.js läuft auf port 8000

Ich kopiert die index.html Seite (siehe unten), um Ihre jeweiligen root-Verzeichnisse.

  1. Wenn ich öffnen http://localhost:8000 alles funktioniert wie erwartet und ich kann sehen, dass der komplette Nachrichtenaustausch.

  2. Wenn ich öffnen http://localhost:8080 alles scheint zu funktionieren (basiert auf request-und response-Headern und Node.js log-im Vergleich zu 1.) aber ich kann sehen, keine message exchange entweder Node.js oder Firebug-log.

  3. Als ich zum ersten öffnen der Seite serviert Node.js, schließen Sie es, dann öffnen Sie die Seite, serviert von Apache funktioniert es. Ich kann sehen, "CONNECTED", "DISCONNECTED", und dann "VERBUNDEN" in den Nachrichten Node.js terminal.

Die Frage ist: wie Fall 2. Arbeit?

Seite:

<script src="http://localhost:8000/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:8000');
    socket.on('server calling', function(data) {
        console.log(data);
        socket.emit('client response', {my : 'data'});
    }); 
    socket.emit('client calling', {foo : 'bar'});
</script>
Hello!

Server:

var app = require('http').createServer(handler);
var io = require('socket.io').listen(app);
var fs = require('fs');

app.listen(8000);

function handler(req,res) {  

    path = req.url == "/" ? "./index.html" : "." + req.url; 
    fs.readFile(path,
        function(err, data) {
            if(err) {
                res.writeHead(500);
                return res.end('Error loading page.');
            }   
            res.writeHead(200);
            res.end(data);
        }   
    );

    io.sockets.on('connection', function (socket) {

        console.log('CONNECTED');

        setInterval(function() {            
            socket.emit('server calling', { hello: 'world' }); 
        }, 2000);

        socket.on('client response', function(data) {
            console.log(data);
        });
        socket.on('disconnect', function() {
            console.log('DISCONNECTED');
        }); 
        socket.on('client calling', function(data) {
            console.log(data);
        }); 
    });
};

Ich bin mir bewusst, dass die folgenden Fragen auf ALSO:

aber ich kann immer noch nicht machen es funktioniert...

Ich versucht habe:

  • "ändern Sie den Pfad zu /socket.io-client/dist/socket.io.js"

Im browser: ReferenceError: io nicht definiert. Wenn ich http://localhost:8000/socket.io-client/dist/socket.io.js bekomme ich Welcome to socket.io. Antwort.

In der server log: info - unbehandelte-Buchse.io-url

  • "dienen socket.io.js von Ihrem Apache-statische server"

Wie würde das funktionieren? Der Apache nicht wissen, wie man mit den /socket.io/socket.io.js und node_modules automagic?

  • dark_ruby vorgeschlagen, die Einrichtung eines proxy -

Änderte ich das script source in der index.html Seite im Apache root-Verzeichnis, in:

<script src="http://localhost:8080/socket.io/"></script>

In der Apache-config habe ich Hinzugefügt:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass /socket.io/ http://localhost:8000/socket.io/socket.io.js

Mit einer solchen Konfiguration öffnen http://localhost:8080 hatte das gleiche Ergebnis wie in 2. oben:

$ node node-server.js
   info  - socket.io started
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized U9xPRw_0rRpsv-K9qVkS
   debug - setting request GET /socket.io/1/websocket/U9xPRw_0rRpsv-K9qVkS
   debug - set heartbeat interval for client U9xPRw_0rRpsv-K9qVkS
   debug - client authorized for 
   debug - websocket writing 1:: 
   debug - emitting heartbeat for client U9xPRw_0rRpsv-K9qVkS
   debug - websocket writing 2:: 
   debug - set heartbeat timeout for client U9xPRw_0rRpsv-K9qVkS
   debug - got heartbeat packet
   debug - cleared heartbeat timeout for client U9xPRw_0rRpsv-K9qVkS
   debug - set heartbeat interval for client U9xPRw_0rRpsv-K9qVkS
   ... 
   info  - transport end (undefined)
   debug - set close timeout for client U9xPRw_0rRpsv-K9qVkS
   debug - cleared close timeout for client U9xPRw_0rRpsv-K9qVkS
   debug - cleared heartbeat interval for client U9xPRw_0rRpsv-K9qVkS
   debug - discarding transport

d.h. es werden keine Nachrichten.

  • versuchen Sie die Einrichtung proxying in apache, die ich kenne nginx nicht machen kann, ziemlich sicher, dass der apache Server zu tun hat, wie gut
  • Ich habe versucht, aber noch keine Freude. Finden Sie die aktualisierte Frage.
  • Ich weiß nicht genug Apache/Buchse.io zu beantworten, um Sie, aber Sie sollten einen Blick auf die sails.js Rahmen, die es beinhaltet-Buchse.io standardmäßig und vielleicht etwas "Magie", die helfen könnten Sie mit Ihrem Problem. sailsjs.org/#! Und hier die doc über sockets: sailsjs.org/#!Dokumentation/sockets
Schreibe einen Kommentar