前面的一篇文章分析了socket.io的客户端的实现,那么这一篇文章来看看它的服务端是怎么搞的吧。。。
首先我们来看一段用于建立socket.io的服务器的代码吧:
var sio = require('socket.io');
var wsocket = sio.listen(80);
wsocket.sockets.on('connection', function (socket) { //当有新的连接建立的时候
socket.on("message", function(data){
console.log("get : " + data);
});
socket.on("disconnect", function(){
//console.log("client has closed");
});
});
这里可以看到,首先其实是调用listen函数来创建,那么我们来看看这个listen函数究竟是干了什么事情吧:
//其实这里是建立一个http的server,然后让其监听端口,这里的server可以是一个httpserver,也可以是一个端口号
//因为其实websocket本身也是建立在http协议基础上的
exports.listen = function (server, options, fn) {
if ('function' == typeof server) {
console.warn('Socket.IO\'s `listen()` method expects an `http.Server` instance\n'
+ 'as its first parameter. Are you migrating from Express 2.x to 3.x?\n'
+ 'If so, check out the "Socket.IO compatibility" section at:\n'
+ 'https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x');
}
if ('function' == typeof options) {
fn = options;
options = {};
}
if ('undefined' == typeof server) {
server = 80; //默认端口是80
}
if ('number' == typeof server) {
var port = server;
//如果传进来的参数是一个数字,那么就在这个端口上创建一个httpserver
if (options && options.key)
server = require('https').createServer(options);
else
server = require('http').createServer();
//默认的request处理
server.on('request', function (req, res) {
res.writeHead(200);
res.end('Welcome to socket.io.');
});
server.listen(port, fn); //监听端口
}
//创建并返回一个manager,其实这个才是最重要的
return new exports.Manager(server, options);
};
其实这里就可以看到,首先是建立一个http的服务器,这里可能刚开始会觉得比较的奇怪,这是因为websocket的协议本身就用到了http协议的内容,有兴趣的可以去看看websocket额协议的内容就知道了,那么最后再创建一个manager,然后将这个manager,这里也就是说我们其实最终用到的是这个manager来管理socket.io的服务器。。。
那么接下来来看看这个manager是怎么定义的吧:
function Manager (server, options) {
this.server = server;
this.namespaces = {};
this.sockets = this.of(''); //创建一个namespace,而且这个namespace会保存到namespaces中,sockets是默认的namespace
this.settings = { //一些默认的参数
origins: '*:*'
, log: true
, store: new MemoryStore
, logger: new Logger
, static: new Static(this)
, heartbeats: true
, resource: '/socket.io'
, transports: defaultTransports
, authorization: false
, blacklist: ['disconnect']
, 'log level': 3
, 'log colors': tty.isatty(process.stdout.fd)
, 'close timeout': 60
, 'heartbeat interval': 25
, 'heartbeat timeout': 60
, 'polli