Node+Express+MongoDB + Socket.io搭建实时聊天应用
Node+Express+MongoDB + Socket.io搭建实时聊天应用
前言
本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战。写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有一些帮助。相信大多数跟随前面一章教程来到这一章的读者大多分成两类,第一类是知道node,想学习node,但是英文匮乏或者网上教程不给力,希望有一个全面一点的教程入门的;第二类应该是node入门,但是之前使用的不是类似MongoDB这种非关系型数据库,想学习一下的。从我个人的角度看来,我希望自己前一段时间关于前端和后端的协同开发经验能够得到提炼和分享。
Nodejs简介
Node.js
是一个基于Chrome JavaScript
运行时建立的一个平台,用来方便地搭建快速的 易于扩展的网络应用。Node.js
借助事件驱动, 非阻塞I/O
模型变得轻量和高效,非常适合 运行在分布式设备的数据密集型的实时应用。--百度百科
对于不熟悉JavaScript
的读者来说,上面的概念可能并不是很亲切,但其实,node作为一个平台,他的很多特性基本上就是JavaScript
本身的特性。本文假设你对JavaScript有一定的了解,对于上面的概念给出本人自己的解释。
我想首先介绍一下宿主环境这个概念。一门语言在运行的时候,需要一个环境,叫做宿主环境。对于JavaScript,宿主环境最常见的是web浏览器,浏览器提供了一个JavaScript运行的环境,这个环境里面,需要提供一些接口,好让JavaScript引擎能够和宿主环境对接。JavaScript引擎才是真正执行JavaScript代码的地方,常见的引擎有V8(目前最快JavaScript引擎、Google生产)、JavaScript core。JavaScript引擎主要做了下面几件事情:(1)一套与宿主环境相联系的规则;(2)JavaScript引擎内核(基本语法规范、逻辑、命令和算法);(3)一组内置对象和API;(4)其他约定。 但是环境不是唯一的,也就是JavaScript不仅仅能够在浏览器里面跑,也能在其他提供了宿主环境的程序里面跑,最常见的就是nodejs。同样作为一个宿主环境,nodejs也有自己的JavaScript引擎--V8。根据官方的定义 Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications -- 来自我的博客 《JavaScript中的this陷阱的最全收集--没有之一》
因此我们可以这么理解node
,它不是一门语言,而是一个平台。node
是JavaScript运行的一个宿主环境,它提供了一些接口,能够让JavaScript引擎与这个宿主环境对接。真正执行JavaScript代码的是JavaScript引擎,也就是V8引擎,这个引擎值Google生产的,是当前最快的JavaScript引擎,没有之一。
Nodejs特性解析
到现在为止我们就知道了Nodejs
的真面貌,但是还不清楚它的几个特点。Nodejs
的这些特点,也可以说是JavaScript
的特点,毕竟Nodejs
只是一个平台,而执行的代码,都是JavaScript
代码。所以我斗胆尝试解释JavaScript/Nodejs
的这几个特点,如有错误,非常欢迎指出。
同步与异步
在JavaScript
里面的调用分成两种,一种是同步调用,一种是异步调用。简单的区别就是,调用的时候能够立马得到结果的就是同步调用,不能立马得到结果的就是异步调用。同步非常好理解,一个简单的数学运算就是同步调用。异步的话,可以举一个常见的例子,一篇文章可能有很多很多评论,在页面加载好的时候,只显示前面几条,如果用户想查看更多,就会点击加载更过评论按钮。为了提高用户体验,通常是发送Ajax请求,获取更多内容。这个请求并不能立马得到回应,而是等待数据返回。等数据返回之后,再动态加载到页面中,这就是异步调用。单线程与Event Loop
为了要弄清楚事件驱动与非阻塞I/O,我们需要大概了解JavaScript运行的时候的原理。也就需要知道单线程和Event Loop这两个概念。什么是单线程呢?我们知道线程是CPU调度的基本单位,单线程意味着JavaScript线程在某一个时刻只能执行一个调用。刚刚又说了,调用分成同步调用和异步调用,这两者的区别决定了在执行JavaScript代码的时候,总是先执行完所有同步代码,再去查看是否有异步调用需要执行。这个原理其实就是JavaScript事件驱动的底层原理--Event Loop
。再具体阐述什么是Event Loop之前,我先借用一张好图:
我们可以看到,在JavaScript
执行栈中,总是先把所有的调用推入栈中,如果遇到了异步调用,就会放到WebAPIs
中,然后继续执行后面的代码,等到WebAPIs
中的异步调用执行完成后,不是立马执行,而是先放到callback queue
里面,那么这个队列里面的函数怎么执行?什么时候执行?中介者就是Event Loop
了,他会一直询问callback queue
里面有无需要执行的代码,如果有,推送到执行栈的最后面,等待执行。如果执行栈中没有同步代码在执行,就会立即执行这个这个回调。拿我们平常写JavaScript
常见的绑定事件处理程序来讲,属于DOM
事件,如果产生了DOM
事件,比如点击鼠标,那么这个时候就会放到callback queue
里,Event Loop
的下一次询问,就会放到执行栈里面。通常执行栈里面的同步代码是很少的,所以通常这个点击后的事件立马就执行了。
以上就是Event Loop
的大致解析。如果想要更加深入理解Event Loop
,可以看看我之前写过的一篇博客《JavaScript的计时器的工作原理》,当然更加推荐大家看看Philip Roberts
大神的演讲《Help, I'm stuck in an event-loop》不过可能需要FQ或者代理。非阻塞I/O与事件驱动
如果你理解了刚刚的Event Loop
,应该就明白了什么叫非阻塞I/O
和事件驱动了。首先还是讲讲什么是非阻塞I/O
。线程在执行中如果遇到磁盘读写或网络通信(统称为
I/O
操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将 资源让给其他的工作线程,这种线程调度方式称为阻塞。当I/O
操作完毕,操作系统将这个线程的阻塞状态解除,恢复其对CPU
的控制权,令其继续执行。这种I/O
模式就是通常的同步式I/O(Synchronous I/O)
.
当线程遇到I/O
操作时,不会以阻塞的方式等待I/O
操作的完成或数据的返回,而只是将I/O
请求发送到操作系统,继续执行下一条语句。当操作系统完成I /O
操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O
,线程必须有事件循环,不断地检查有没有未处理的事件,依次处理。 --《Nodejs开发指南》
如果JavaScript
是阻塞I/O
,拿之前加载更多评论的例子看来,只要数据还没有从服务器返回,所有后续的操作都将阻塞,比如点击其他绑定了事件处理程序的按钮。幸运的事,正如《Nodejs开发指南》提到的一样,线程必须有事件循环,也就是刚刚说到的Event Loop
!那么非阻塞I/O
也就自然而然地理解了。至于事件驱动,它和非阻塞I/O
应当是因果关系的,因为JavaScript
是基于事件驱动的,所以成就了非阻塞I/O
的特性。因为要做到异步的话,常用的就是发送异步请求,请求相应之后,执行回调事件,事件在JavaScript
中无处不在。
Node安装
与Python等安装不同的是,Nodejs在Windows下面的安装反而比在Linux下面简单的多。本来想自己写安装过程的,发现W3CSchool讲解的非常准确,所以这里只给出链接。安装教程链接:http://www.w3cschool.cc/nodejs/nodejs-install-setup.html
你可以通过node -v
命令来检测是否安装成功:
后话
本教程旨在给出一个实战教程,这一章主要是介绍Nodejs和JavaScript的运行原理,上一章讲解了MongoDB的入门教程,如果你想跟随本教程学习,可以从上一篇文章看起《Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门》,与大家探讨技术。本系列教程同步到个人的Github:https://github.com/yuanzm/MongoDB-demo.如需转载,请务必注明原文链接
参考资料
http://www.infoq.com/cn/articles/tyq-nodejs-event
http://www.jb51.net/article/53812.htm
http://www.ituring.com.cn/article/5779
http://www.w3cschool.cc/nodejs/nodejs-install-setup.html
http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/
Node+Express+MongoDB + Socket.io搭建实时聊天应用的更多相关文章
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建
前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...
- Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门
前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(三)--前后端环境配置
前言 之前都是介绍一些基础知识,在这一节,我们就要开始实战coding了.正所谓磨刀不误砍柴工,准备工作显得尤为重要.很多demo只是追求效果的实现,并不注重整个demo的架构性.从我个人的角度看来, ...
- vue+websocket+express+mongodb实战项目(实时聊天)
继上一个项目用vuejs仿网易云音乐(实现听歌以及搜索功能)后,发现上一个项目单纯用vue的model管理十分混乱,然后我去看了看vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜 ...
- vue+websocket+express+mongodb实战项目(实时聊天)(二)
原项目地址:[ vue+websocket+express+mongodb实战项目(实时聊天)(一)][http://blog.csdn.net/blueblueskyhua/article/deta ...
- express+mongodb+socket.io
node后端代码 // Setup basic express server var express = require('express'); var app = express(); var pa ...
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- (转)使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
随机推荐
- LINQ之路(1):LINQ基础
本文将从什么是LINQ(What).为什么使用LINQ(Why)以及如何使用LINQ(How)三个方面来进行说明. 1.什么是LINQ LINQ(Language Integrated Query)是 ...
- 如何成为游戏的生产者——第二章:如何开始你的编程(开发环境的搭建、C++语言适应)
如何成为游戏的生产者--文章二章:怎样開始你的编程 小故事:上节说到我六年级打开了那本C语言的书,然后其实我还是没看懂.好像看懂了一些printf语句.之后遇到了史无前例的困难--怎么让代码执行起来. ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- iOS开发- 隐藏状态栏(电池栏)
分为两种情况: 1. 想要隐藏某个视图的状态栏, 比方说, 从界面A, push 到界面B的时候, 界面A原本显示状态栏, 然而我们须要界面B不显示状态栏. 这时候, 能够这样做: 在B中实现: - ...
- HDU 1195 Open the Lock (双宽搜索)
意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别 ...
- 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历
原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过 ...
- 例如找出令人信服的权威C++中间malloc与new
例如找出令人信服的权威C++中间malloc与new 问题: 非常多人都知道malloc与new都是用来申请空间用的,开辟空间来源于堆中. 可是在C++中却非常少用malloc去申请空间,为什么? 以 ...
- SVD奇异值分解的几何物理意义资料汇总
学习SVD奇异值分解的网上资料汇总: 1. 关于svd的一篇概念文,这篇文章也是后续几篇文章的鼻祖~ http://www.ams.org/samplings/feature-column/fcarc ...
- 基于PaaS人事部门间平台多重身份的技术解决方案
1.系统状态 该系统采用一个范围的省,它包含省总部和各中心.十三市分公司.其中,各县(市)局和办事处城市管理部门:由省级总部部门管理中心,它仅包含主省党部的工作人员.另一种是不在系统中. 系统业务包含 ...
- 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着
对"demo!demo.Index+HookProc::Invoke"垃圾收集的类型已委托回调.这可能会导致应用程序崩溃.损坏和数据丢失.当传递委托给非托管代码,托管应用程序必须承 ...