如何理解socket.io官网上创建聊天室的demo

来源:互联网 发布:单反吧口碑好的淘宝店 编辑:程序博客网 时间:2024/05/17 04:50

下面代码是socket.io 官网上使用express作为服务器框架,使用socket.io作为通讯工具搭建聊天室的demo的代码,本人通过查看express源码和socket.io源码,对该服务的创建过程有一些自己的理解,特记录下来以便日后复习,也希望能帮助到一些同学,如有不妥之处,请多多指教。

var app = require('express')();var http = require('http').Server(app);var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendfile('index.html');});io.on('connection', function(socket){  console.log('a user connected');});http.listen(3000, function(){  console.log('listening on *:3000');});

要理解上面的例子,我们首先来看看使用nodejs原始方法创建http服务器和使用express框架创建服务器的方法。

使用nodejs创建http server的步骤:

var http = require('http');   //加载http模块var server = http.createServer(function(req, res){});   //创建http服务器 并且制定监听器server.listen(3000) //指定监听端口号

这样已经创建了一个http服务器,可以在服务器上访问3000端口。

使用express框架创建服务器的步骤如下:

var express = require('express');   //加载express模块var app = express();    app.listen(3000);

调用express() 函数会返回一个函数对象并赋值给app,该函数对象的函数体如下:

function(req, res, next) {      app.handle(req, res, next);};

其中app.handle()方法是从application 模块继承下来的,这个方法就是用来具体处理http请求的,具体实现可以查看express/lib/application.js文件。这里不做深究,我们可以看到,这个函数对象和的函数体和使用原始方法创建服务是传递的函数体 /* function(req, res){} */是不是很像。接下来我们在看看app.listen方法,app.listen方法如下:

function listen() {  var server = http.createServer(this);  return server.listen.apply(server, arguments);}

可以看到,使用express创建服务是在调用app.listen()时才创建http服务,而app.listen()中的this指的是app函数对象的函数体本身,也就是上面提到的

function(req, res, next) {      app.handle(req, res, next);};

也就是说,在app.listen()中创建http服务,并且使用上面函数作为监听器来处理http请求。
并且返回该服务器的实例。

理解了上面的流程之后,我们在来看创建聊天室的代码:

var app = require('express')();var http = require('http').Server(app);var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendfile('index.html');});io.on('connection', function(socket){  console.log('a user connected');});http.listen(3000, function(){  console.log('listening on *:3000');});

第一行 的app是一个函数对象,其函数体如下:

function(req, res, next) {      app.handle(req, res, next);};

第二行代码创建了一个http服务,并且用app函数作为监听器,用来处理http请求。
第三行代码创建了一个将创建的http.Server实例作为参数传递给了require(‘socket.io’)(http)创建了一个socket.io服务。于是该socket.io服务于http.Server服务共享同一端口。

由于app.listen()能够创建一个http.Server实例并返回,所以上面代码还可以写成:

var app = require('express')();var http = app.listen(3000, function(){  console.log('listening on *:3000');});var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendfile('index.html');});io.on('connection', function(socket){  console.log('a user connected');});
0 0
原创粉丝点击