socket.io服务端分析

本文深入探讨了socket.io服务端的实现,从listen函数开始,解释了如何通过http服务器建立socket.io服务,并详细阐述了manager的角色。内容涉及http请求、websocket升级、握手过程以及如何建立websocket连接。socket.io在连接建立后,对socket进行封装,通过transport处理数据帧,解析和编码遵循websocket协议。整个服务端的工作流程清晰地展现在读者面前。
摘要由CSDN通过智能技术生成

前面的一篇文章分析了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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值