socket.io 入门教程
转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html
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 入门教程的更多相关文章
- socket.io入门整理教程
socket.io入门整理 发布于 5 年前 作者 dtrex 124983 次浏览 最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...
- 最基础的Python的socket编程入门教程
最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...
- Socket.io 入门 - Renyi的博客
Socket.io Vue 中使用 NPM 安装 npm install vue-socket.io --save npm install --save socket.io-client 引用 详情 ...
- Node.js、Express、Socket.io 入门
前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...
- 转载:socket.io 入门
原文链接:http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单 ...
- socket.io 入门篇(三)
本文原文地址:https://www.limitcode.com/detail/5926e3a056fba70278bf2044.html 前言 上篇我们介绍了 socket.io 中room的概念和 ...
- socket.io 入门篇(二)
本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...
- socket.io 入门篇(一)
本文原文地址:https://www.limitcode.com/detail/591b114bb1d4fe074099d9c9.html 前言 本篇介绍使用node.js模块组件socket.io实 ...
- socket.io入门整理
我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序. 最最开始 先安装socket.io: 1 npm install socket.io 利用Nod ...
随机推荐
- 《Java程序设计》第四周学习总结
20145224-陈颢文 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 ·继承就是面向对象中,子类继承父类,避免重复的行为定义.重复再程序设计上是非常不好的信号 ...
- js-- 一些题目
1. ~~3.14~~3.14=-((~3.14)+1)=-(-(3.14+1)+1)=-(-(3+1)+1)=-(-4+1) =-(-3)=3 按位非(NOT)(~)操作数的负值减1. 2. var ...
- python中的异常处理
主要用到 try...except...raise...finally... 1. try...except... try: for i in range(1, 1000): print i time ...
- Java 基础知识点(必知必会其二)
1.如何将数字输出为每三位逗号分隔的格式,例如“1,234,467”? package com.Gxjun.problem; import java.text.DecimalFormat; impor ...
- ABAP简单表维护的制作
为了知识的积累,特作了个简单的表维护. 因为自己之前做dynpro程序的时候建了一个Tree node的表,所以就不在此重复.(在表的交付和维护页签中标的属性要是‘允许标准表维护的’) 直接Alt+U ...
- struts2视频学习笔记 09-10(struts2处理流程,指定多个struts配置文件)
课时9 Struts2的处理流程 StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它负责拦截由<url-pattern>/*</url- ...
- Google Chrome 源码下载地址 (Google Chrome Source Code Download)
1. Google Chrome 源码 SVN 地址:http://src.chromium.org/svn.包含有 Chrome.Gears.Webkit.GCC 等源码以及编译依赖工具.Chrom ...
- 如何实现301的跳转?当输入域名http://xxx.com的时候自动重定向到www上去
答案:在服务器上操作,注意勾选和不勾选的区别,使用Fiddle进行观察,301和302之间的区别
- 当进入log文件后就卡机
问题:一个目录打开,终端就卡死不动了 Ctrl+c也没用,cat一样没用? 解决办法:用的时间或用的数量删除(时间已经否决掉) ls -t |tail -1000 |xargs rm 原因: log ...
- Java 面向对象编程——第一章 初识Java
第一章 初识Java 1. 什么是Java? Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以其强安全性.平台无关性.硬件结构无关性.语言简 ...