基于 nodejs 的 webSockt (socket.io) 理解

  1. 本文的业务基础是在基于 nodejs socket.io 的直播间聊天室(IM)应用来的。
  2. 项目中具体的 框架如下 express + mongodb + socket.io
  3. 在介绍 socket.io 之前,我们有必要对 webSocket 进行根本的原理的理解。

一、webSocket 的前生今世

  1. 1、什么是 webSocket
  2. 2、如何去用?
  3. 3、经常使用的场景?
  4. 4、需要注意的地方
  5. 好了,下面我们就按照上面 提到的四点来进行分析。
1、 什么是 websocket

官方文档解读: webSocket

  1. 这个是 MDN 的官方文档。详细的内容需要读者自己仔细去阅读了,笔者这里只介绍 容易出错的问题。
  2. 1WebSockets 是一个可以创建和服务器间进行双向会话的高级技术。通过这个API你可以向服务器发送消息并接受基于事件驱动的响应,这样就不用向服务器轮询获取数据了。
  3. 当然这个只是说用来解决 不用向服务器轮询获取数据问题。 这么来说的话其实还是不太够 ‘官方’。
  4. 非官方理解: B/S 结构的软件项目中,客户端通过 httphttps 等方式获得服务器消息,但是默认的 http 协议只支持 请求响应模式,这种模式简化了 web 服务器,减少服务器负担,加快网站的响应速度。 但是不能满足 我们实时消息推送,聊天室等功能,这个时候 websocket 这个本 作为 unix 进程通信机制 就被嫁接到了 应用程序间网络通信,从而就有了如今的 socket
2、Websocket: 通信模型

  1. WebSocketHTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信。
  2. 特点: 事件驱动、异步 使用 ws 或者 wss 协议的 socket 实现真正意义上的 推送功能
  3. 这里的 ws wss 区别跟 http https 的区别一样(安全性)
  4. 缺点就是 兼容性(今年已经 2017年了,应该可以不用考虑这个问题了)
3、 websocket 客户端
  1. 官方文档中回提供系列的 api 具体如下:
  2. 分类如下:
  3. a 连接类:
  4. 1send() 向远程服务器发送数据
  5. 2close() 关闭该websocket链接
  6. b) 监听函数类:
  7. 1onopen 当网络连接建立时触发该事件
  8. 2onerror 当网络发生错误时触发该事件
  9. 3onclose websocket 被关闭时触发该事件
  10. 4onmessage websocket 接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。 其中 我们可以定义各类 onmessage 事件的 type 从而 扩展我们的 onmessage 事件。
  11. c) websocket还定义了一个readyState属性:
  12. 1CONNECTING(0) websocket正尝试与服务器建立连接
  13. 2OPEN(1) websocket与服务器已经建立连接
  14. 3CLOSING(2) websocket正在关闭与服务器的连接
  15. 4CLOSED(3) websocket已经关闭了与服务器的连接
4、 websocket 服务端
  1. 服务端就像是一个分发中心, 但是首先都得通过 connect 创建连接 从而形成 ws 的长连接。
  2. 只要 长连接 连接成功,那么接下来的事情就很好操作了, 比如在服务端 emit 触发一个事件,那么在 服务端就需要监听 on 方法来监听同一个事件,最后如果需要让 当前房间(注: 这里有个 单房间 多房间的概念,我们在后面的介绍中会仔细的提到的)内的所有连接用户都被通知到这则消息,那么 在监听到服务端触发的消息的同时,再来触发一个广播给 客户端, 这个时候只要是在当前 ws 连接线上的所有用户都会被 emit 触发到这个事件,从而实现了 广播。
  3. 上面的这一长段话,可能暂时不太好理解,但是如果 亲手来写上这么一个 demo 就会理解很多了。

二、 基于 nodeJs 的 webSocket 框架 socket.io

  1. socket.io 是这篇文章的主角,因为它对 webSocket 做了一个非常完善的封装, 并且提出了 多房间 多命名空间的 概念,让多聊天室同时存在不再是一个问题,所以,下面就会详细的来介绍下 socket.io 这个框架

http://socket.io 这个是官网

  1. 我们在官网中 可以看到非常简洁的 socket.io 的应用方法。
  2. 并且还展示了一个全世界通用的 IM (虽然这里常常可以看到 f**k xxx

好了,下面就针对 这个 socket.io 再进行一个详细的介绍

  1. 1 Server api
  2. 2 Client api
  3. 3 Rooms and NameSpace

这要就针对这三个来进行介绍

1、 Server api
  1. 服务端初始化 io 对象
  1. const io = require('socket.io')();
  2. // or
  3. const Server = require('socket.io');
  4. const io = new Server();
  1. 这个时候就需要看 你的后台 服务的语言, php java nodejs 等等
  2. 我是用的 nodejs 所以直接 使用 express or koa2 均可
  3. 然后创建 http-server 服务
  1. const socket = require('socket.io');
  2. var app = express()
  3. var server = http.createServer(app)
  4. io = socket(server)
  5. io.on('connection', function(socket) {
  6. // to do somethings
  7. })
  1. 上面的这个步骤就可以轻松的 通过 nodejs + express 创建了一个 socket 服务端的 服务了
2、 Client api
  1. 上面的步骤中已经在 服务端进行了 一些列 的操作 ,这个时候就需要 在服务端 创建 连接
  2. 首先是 需要在 前端引用 这个 socket 文件

  1. <script src="/socket.io/socket.io.js"></script>
  2. <script>
  3. const socket = io('http://localhost');
  4. </script>
  5. const io = require('socket.io-client');
  6. // or with import syntax
  7. import io from 'socket.io-client';
  1. 然后 创建 连接

  1. const socket = io();
  1. 然后 触发监听 'connection'

  1. io.on('connection', (socket) => {
  2. let token = socket.handshake.query.token;
  3. // ...
  4. })
  1. 加入这个时候你在 服务端 打印 debug 如果顺利 就可以轻松 完成了第一个 socket 的链接啦~
3、 Rooms and NameSpace
  1. 最后这里 介绍到的 rooms namespace 的概念
  2. 在多房间 聊天室 占据了很大的作用
  3. 其中 介绍下 rooms 概念 关于 namespace 相关可以到 socket.io 官网中进行查看

  1. // 广播给当前房间除了自己以外的所有人
  2. socket.broadcast.to(roomId).emit('msg', {
  3. // take somethings
  4. })
  5. // 广播给当前房间中自己
  6. socket.emit('msg', {
  7. // take somethings
  8. })
  9. // 广播给当前房间的所有人
  10. socket.to(roomId).emit('msg', {
  11. // take somethings
  12. })
  1. 然后再结合上面的 监听 触发 方法,完成一系列的需求任务。

恩,今天先到这里,有什么问题,可以留言互相学习。 欢迎推荐~~~

附上 github地址

基于 nodejs 的 webSockt (socket.io)的更多相关文章

  1. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

  2. 9.nodejs权威指南--Socket.IO

    1. Socket.IO 1.1 服务器 var http = require('http'); var sio = require('socket.io'); var fs = require('f ...

  3. Nodejs npm安装socket.io报错解决办法

    安装socket.io时,报错,提示需要安装Microsoft visual studio 2005 或 Net framework 2.0 sdk,没有找到vcbuild.exe,解决办法是安装 . ...

  4. NodeJs多进程和socket.io通讯-DEMO

    一.开启多进程 const os = require('os'); const cp = require('child_process'); const forkList = {}; const fo ...

  5. 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能

    1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块  修改了start 脚本  nodemo ...

  6. koa+mysql+vue+socket.io全栈开发之web api篇

    目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd操作的http接口,登录验证使用的是 json web token,跨域方案使用的是 ...

  7. Cannot find module 'socket.io'

    That's all. Then I try to use socket.io with this line: var io = require('socket.io').listen(app); A ...

  8. 前端笔记之微信小程序(四)WebSocket&Socket.io&摇一摇案例&地图|地理位置

    一.WebSocket概述 http://www.ruanyifeng.com/blog/2017/05/websocket.html Workerman一款开源高性能异步PHP socket即时通讯 ...

  9. Socket.IO基础教程

    什么是Socket.IO Socket.IO是一个库,可用于在浏览器和服务器之间进行实时,双向和基于事件的通信.它包括: 使Node.js服务器:来源 | API 为浏览器(可从Node.js的也运行 ...

随机推荐

  1. 构造函数,This关键字

    构造函数: 即构建创造对象时调用的函数.在new的时候自动执行,给对象进行初始化.创建对象都必须要通过构造函数初始化.(有参和无参) 一个类中如果没有定义过构造函数,那么类中会有一个默认的空参数构造函 ...

  2. Spring装配Bean之组件扫描和自动装配

    Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现应用上下文中所创建的bean. 自动装配:Spring自动满足bean之间的依赖. 案例:音响系统的组件.首先为CD创建Com ...

  3. 如何让vim像IDE一样一键放大缩小字号?

    原创,转载请注明出处 在其他IDE中,比如codeblocks,按住ctrl,然后滑动鼠标滚轮就可以实现字体的放大缩小. 在强大的vim中code怎么能缺少这种功能?! 在vim插件库中查询一番,发现 ...

  4. sql里的null和空的区别

    null表示为未知,未定义: 空表示为空白,或者0: sql查询,排序时null在''的前面: 定义字段为not null,写为空可以写入: null不可以用来比较,只能用is null判断:

  5. 树莓派.使用Node.js来制作一个作业检查仪

    先上图 前段时间, 花了点时间给女儿做了个数学习题的小程序 首页 做题界面(题目每次都随机生成, 加减乘除都有) 做题记录 现在问题来了, 怎么才能随时知道作业有没有完成呢? 每次打开做题记录页面刷新 ...

  6. LeetCode 56. Merge Intervals (合并区间)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  7. 06-从零玩转JavaWeb-数组在内存当中的存放形式

    一.JVM的内存划分 想要了解数组的内存存储,先要了解JVM的整体内存划分,详细参见第04JVM内存详解 二.数组在JVM当中的存储详解  假如我们有如下代码: 上面代码当中,创建数组的过程我们可以把 ...

  8. 直方图均衡化C++实现

    直方图均衡化在图像增强方面有着很重要的应用.一些拍摄得到的图片,我们从其直方图可以看出,它的分布是集中于某些灰度区间,这导致人在视觉上感觉这张图的对比度不高.所以,对于这类图像,我们可以通过直方图均衡 ...

  9. linux学习(一)认识、安装Linux

    一.什么是Linux linux是一种操作系统,我们用的android和ios就是分别是linux操作系统和类unix操作系统. linux也是我们经常说的服务器.我们看的网站,游戏,app背后都是服 ...

  10. hadoop2 YARN/Mv2中 ApplicationMaster相关问题及介绍

    ApplicationMaster是什么? ApplicationMaster是一个框架特殊的库,对于Map-Reduce计算模型而言有它自己的ApplicationMaster实现,对于其他的想要运 ...