文档章节

socket.io 入门教程

短短的歼击机
 短短的歼击机
发布于 2014/09/25 10:39
字数 968
阅读 1242
收藏 1

socket.io

socket.io是一个以实现跨浏览器、跨平台的实时应用为目的的项目。针对不同的浏览器版本或者不同客户端会做自动降级处理,选择合适的实现方式(websocket, long pull..),隐藏实现只暴露统一的接口。可以让应用只关注于业务层面上。
nodejs服务器端安装:npm install socket.io
安装之后就可以require模块来使用了:

var sio = require('socket.io');

在客户端的话,可以通过

<script src="/socket.io/socket.io.js"></script>

或者引用socket.io的CDN服务。

<script src="http://cdn.socket.io/stable/socket.io.js"></script>

在它的官方网站上有各种用法的介绍。

实际使用

这个项目是搭建在connect之上的,因此需要在connect上使用socket.io,同时,因为编辑文件有权限限制,因此还需要在socket.io中使用session和一些其他的连接信息来确认权限。
先看一下socket.io的使用, 服务端:

var io = require('socket.io').listen(80); io.sockets.on('connection', function(socket){ socket.emit('news', { hello: 'world' }); socket.on('my other event', function(data){ console.log(data); }); });

浏览器端:

<script src="/socket.io/socket.io.js"></script> <script>varsocket=io.connect('http://localhost');socket.on('news',function(data){console.log(data);socket.emit('my other event',{my:'data'});});</script>

在服务端收到connection的事件的时候,socket会携带一个建立连接时浏览器端传过来的握手信息socket.handshake,我们把它打印出来大概会是下面这个样子:

{ headers: { host: 'cnodejs.net:8080', connection: 'keep-alive', referer: 'http://cnodejs.net:8080/editor/pipe', 'user-agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30', accept: '*/*', 'accept-encoding': 'gzip,deflate,sdch', 'accept-language': 'zh-CN,zh;q=0.8', 'accept-charset': 'UTF-8,*;q=0.5', cookie: 'NAEIDE_console_hide=0; lzstat_uv=7551240663017376909|2341473@2717849; lzstat_ss=2468024318_3_1325124834_2717849; connect.sid=z5sT8ER8SIzyknF6HYnIEdWz.l6oFdxYR24fSV85JIpLcpBabQtqDPB%2BUPm1DR1wqAEU; NAE_c_location=BOTTOM; NAE_c_display=1' }, address: { address: '123.157.218.120', port: 60285 }, time: 'Thu Dec 29 2011 02:21:23 GMT+0800 (CST)', query: { t: '1325096038995' }, url: '/socket.io/1/?t=1325096038995', xdomain: false, secure: undefined }

这些浏览器端的信息得到之后,就很容易进行权限的验证了。socket.io同时提供了

io.set(authorization, callback);

方法来对每个连接进行权限限制。

session与权限验证

权限验证非常重要的一部分就是session验证了,在handshake信息中,可以获取到浏览器端的cookie信息,根据connect(express也一样)的session机制,在cookie中有一项为connect.sid,存放了session在服务器端存储容器中存放的key,通过这个key我们就可以获取到session值。

var io = require('socket.io').listen(app); var ep = require('EventProxy.js').EventProxy; var parseCookie = require('connect').utils.parseCookie; io.set('authorization', function(data,accept){ var proxy = new ep(); //get sessionId from cookie & get session from sessionStore var parse = function(){ if(data.headers.cookie){ //use parseCookie in connect.utils data.cookie = parseCookie(data.headers.cookie); data.sessionId = data.cookie['connect.sid']; //getSession( by connect sessionStore.get) SessionStore.get(data.sessionId, function(err,session){ if(err || !session){ proxy.unbind(); return accept(err.toString(), false); }else{ data.session = session; proxy.fire('session_got'); } }) }else{ proxy.unbind(); return accept('No cookie transmitted.', false); } } //get auth form database var checkAuth = function(){ //get info in referer data.app = getApp(data.headers.referer||''); //check auth check(data.session.user, data.app, function(err,result){ if(result){ accept(null, true); }else{ accept(err?err.message:'permision denied.', false); } }) } proxy.once('session_got', checkAuth); parse(); })

通过socket.io完成时事通信

此时所有经过验证的连接的handshake信息里,已经多出了app和session的信息,我们把这些连接按照app来分类,因为所有的app相同的连接,收到的信息也将是相同的。

io.sockets.on('connection', function(socket){ // some socket connect var hs = socket.handshake; //when socket connect, put this socket into room [hs.app] socket.join(hs.app); //some socket disconnect socket.on('disconnect', function(){ }); }); var proxy = new ep(); //when get stdout data, send msg to sockets in this room proxy.on('stdout', function(data){ io.sockets.in(data.room).send(data.log); }) getData(data){ proxy.fire('stdout', data); }

此时只要获取到了输出信息,就会通过socket.io传递到页面,触发页面的'message'事件,渲染页面。

关闭debug信息

在socket.io启用的时候,会不停的打出debug和心跳等信息,在生产环境下我们不想要这么详细的输出,可以通过

io.set('log level', 1);

来关闭调试信息的输出。

总结

socket.io是nodejs实现实时web系统的不二选择,特别是非常符合nodejs的事件驱动特性,不需要绕弯就能够完成实时系统。

© 著作权归作者所有

上一篇: socket.io
下一篇: AndroidAsync
短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
Socket.IO 和 Node.js 入门

Node.js 并不能做所有事情,但它可通过 Socket.IO 库轻松实现 WebSockets。使用 WebSockets 可轻松构建实时多用户的应用程序或游戏,今天我们将讲述如何使用 Node.js 和 Socket.IO 构建简单的...

红薯
2012/05/16
46.2K
25
Socket.IO 和 Node.js 入门

Node.js 并不能做所有事情,但它可通过 Socket.IO 库轻松实现 WebSockets。使用 WebSockets 可轻松构建实时多用户的应用程序或游戏,今天我们将讲述如何使用 Node.js 和 Socket.IO 构建简单的...

王振威
2012/11/27
1K
0
10+ 最佳的 Node.js 教程结合实例

如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用、API服务编写、投票问卷应用、人物投票APP、社交授权、 Node.js on Raspberry Pi等等。 以下是N...

noeticforce
2016/06/21
7.2K
10
八问WebSocket协议:为你快速解答WebSocket热门疑问

本文由“小姐姐养的狗”原创发布于“小姐姐味道”公众号,原题《WebSocket协议 8 问》,收录时有优化和改动。感谢原作者的分享。 一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范...

JackJiang2011
04/25
0
0
socket.io简单入门(一.实现简单的图表推送)

引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器。但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素。 研究本例...

鱼煎
01/22
15
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
7
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
8
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部