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.
-
Wenn ich öffnen
http://localhost:8000
alles funktioniert wie erwartet und ich kann sehen, dass der komplette Nachrichtenaustausch. -
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. -
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre io.sockel befindet sich innerhalb der handler-Funktion.
Ich nehme an, es wird aufgerufen werden, wenn Sie eine Anfrage an node-JS-server. Bis dann, node-JS-server wird nie ausgeführt Ihre IO-code.
Versuchen Sie, es aus der hf und fügen Sie es in Ihrem app.js.
Und keine Notwendigkeit, ändern Sie den Pfad oder den proxy. Der code, den Sie geschrieben ist-ursprünglich einfach nur gut. Das problem ist nicht mit der be socket.io.js Datei. Aber-node-server die Erkennung von E /a-Ereignisse.