如何一起托pipe一个socket.io服务器和一个http服务器?
我有一个Socket.io
服务器和一个基本的HTTP服务器,我编码在一起,但问题是,HTTP服务器试图服务于socket.io
应该服务的请求。
码:
//Dependences var sio = require('socket.io'); var http = require("http"); var NewRequestHandler = require('./NewRequestHandler').Handler; var DisconnectHandler = require('./DisconnectHandler').Handler; var AuthorisationRequestHandler = require('./AuthorisationRequestHandler').Handler; //The backlog of resources var ResourceBackLog; var ResourceRequestHandler = require("./ResourceRequestHandler").Handler; //Reports the IP adress and Port that it will run on. console.log('IP address: ' + process.env.IP); console.log('Port: ' + process.env.PORT); //Creates and configures a new http.server instance. var Server = new http.Server(); //Starts both the http and socket.io server. var io = sio.listen(Server.listen(process.env.PORT, process.env.IP, ResourceBackLog, function(error) { if (error) { console.log("Error: " + error); } else if (!error) { console.log("Server started sucsessfully."); Server.on('request', ResourceRequestHandler); console.log("Server now ready for requests."); } })); //Handles the connect and authorisation bit io.sockets.on('connection', function(socket) { console.log('New Connection'); socket.on('auth', function(Keys) { console.log('Autorisation Request Recived'); AuthorisationRequestHandler(socket, Keys, function() { socket.on('NewRequest', function(Request) { NewRequestHandler(socket, Request); }); socket.on('diconnect', function() { DisconnectHandler(socket); }); }); }); });
ResourceRequestHandler是通过检查URL然后在该位置打开文件来为资源提供服务的文件,但它也服务于/socket.io请求。
我会有Socket.io侦听另一个端口,并有正规的http服务器直接请求,这样可以确保他们不会互相干扰。
// create server io = http.createServer(); io.on('uncaughtException', function(exception) { console.log(exception); }); io.listen(4001);
http.createServer(RequestHandler)
和new http.Server(RequestHandler)
工作
基于Socket.IO 0.9.6。
在socket.io之前附加自定义的请求监听器是很重要的。 然后Socket.IO将处理它所需的请求,并将所有其他请求委托给你自己的请求监听器。
socket.io/lib/manger.js中的algorithm如下。 在构造函数中:1.删除所有现有的请求侦听器。 2.附上Socket.IO请求侦听器。 根据要求:1.尝试处理请求。 2.如果Socket.IO无法处理它,它将请求委托给原来的侦听器 – 那些早先在构造器中被删除的侦听器。