如何使Apache和Node.js与Socket.io安装程序工作?

从Node.js / Socket.io开始。 最终,我想用Apache服务页面,同时用Node.js服务器推送和增加一些内容。 这只是一个小testing,看看它是如何工作的。 这是我的设置:

  • 运行在端口8080上的Apache
  • 运行在端口8000上的Node.js

index.html页面(见下文) 复制到它们各自的根目录。

  1. 当我打开http://localhost:8000一切正常,我可以看到完整的消息交换。

  2. 当我打开http://localhost:8080一切似乎都起作用(基于请求和响应头,而Node.js日志与1比较),但在Node.js或Firebug日志中我看不到任何消息交换

  3. 当我第一次打开由Node.js服务的页面时,closures它,然后打开由Apache服务的页面。 我可以在Node.jsterminal中看到“CONNECTED”,“DISCONNECTED”,然后是“CONNECTED”消息。

问题是:如何使案例2工作?

页:

 <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! 

服务器:

 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); }); }); }; 

我知道关于SO的以下问题:

  • Node.js + Socket.io + Apache
  • node.js和apache在不同的服务器上

但我仍然无法完成工作

我试过了:

  • “将path更改为/socket.io-client/dist/socket.io.js”

在浏览器中: ReferenceError:io没有定义 。 当我去http://localhost:8000/socket.io-client/dist/socket.io.js我得到欢迎来到socket.io。 响应。

在服务器日志中: info – 未处理的socket.io url

  • “从Apache静态服务器提供socket.io.js”

这将如何工作? Apache不知道如何处理/socket.io/socket.io.jsnode_modules

  • dark_rubybuild议设置一个代理

我将Apache根目录的index.html页面中的脚本源更改为:

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

在Apacheconfiguration中,我添加了:

 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 

用这样的configuration打开http://localhost:8080的结果与上面的2相同:

 $ 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 

即没有消息。

你的io.sockets位于处理函数内部。 我假设它将被调用,当你向节点的JS服务器的请求。 直到那时,节点JS服务器从不执行你的IO代码。

尝试将其移出处理程序并将其添加到您的app.js.

而且不需要更改路径或代理。 你最初发布的代码很好。 问题不在于加载socket.io.js文件。 但节点服务器检测io事件。