Socket.IO 概述
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3826251.html
Socket.IO简述
Socket.IO用于浏览器与node.js之间实现实时通信。Socket.IO设计的目标是支持任何的浏览器,任何Mobile设备。支持主流的PC浏览器 (IE,Safari,Chrome,Firefox,Opera等),Mobile浏览器(iphone Safari/ipad Safari/android WebKit/WebOS WebKit等)。
Socket.IO支持如下方式的通信方式,根据浏览器的支持程度,自动选择使用哪种技术进行通信:
- WebSocket
- Flash Socket
- AJAX long-polling
- AJAX multipart streaming
- Forever IFrame
- JSONP polling
Socket.IO解决了实时的通信问题,并统一了服务端与客户端的编程方式。启动了socket以后,就像建立了一条客户端与服务端的管道,两边可以互通有无。
关于engine.io
engine.io是一个Socket.IO的抽象实现,作为Socket.IO的服务器和浏览器之间交换的数据的传输层。它不会取代Socket.IO,它只是抽象出固有的复杂性,支持多种浏览器,设备和网络的实时数据交换。
Socket.IO的基本使用方式
建立服务器
例:创建io服务器的两种简单的方法。
var io = require('Socket.IO')(); // 或 var Server = require('Socket.IO');
var io = new Server();
服务器配置
Socket.IO服务器的配置项与engine.io相同。
- pingTimeout (Number):等待响应包的时间,单位为毫秒。默认为60000。
- pingInterval (Number):设定每隔在一定时间发送一个ping包,可以用于心跳包的设置。默认为25000。
- maxHttpBufferSize (Number):消息最大大小,可用于避免DoS攻击。默认为 10E7。
- allowRequest (Function):该配置项为一个函数。第一个参数是一个一个握手或连接请求。第二个参数是一个回调函数function(err,success),success是boolean值,false表示连接失败;err是错误码。该函数可以用于决定是否继续。
- transports (<Array> String):指定传输的连接方式。默认为['polling', 'websocket']。
- allowUpgrades (Boolean):是否允许升级传输协议。 默认为true。
- cookie (String|Boolean):HTTP Cookie的名字。默认为io。
通过Node http server使用Socket.IO
// Server (app.js) var app = require('http').createServer(handler)
var io = require('Socket.IO')(app);
var fs = require('fs');
app.listen(80);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
} io.on('connection', function (socket) { socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
}); }); // Client (index.html)
<script src="/Socket.IO/Socket.IO.js"></script>
<script>
var socket = io('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
通过Express 3/4 使用Socket.IO
// Server (app.js)
var app = require('express')();
var server = require('http').Server(app);
var io = require('Socket.IO')(server);
server.listen(80); app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
}); io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
}); // Client (index.html)
<script src="/Socket.IO/Socket.IO.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
发送以及接收事件
Socket.IO 提供了默认事件(如:connect, message, disconnect)。另外,Socket.IO允许发送并接收自定义事件。
事件的发送:
//发送给对应的客户端
socket.emit('message',"this is a test"); //发送给所有客户端
io.sockets.emit('message',"this is a test"); //发送消息给指定socketId的客户端。
io.sockets.socket(socketid).emit('message','for your eyes only'); //发送自定义的事件
socket.emit("my-event","this is a test");
事件的接收:
socket.on("event name",function(data){
//data为接收到的数据。
});
示例代码
例1:
// note, io.listen(<port>) will create a http server for you
var io = require('Socket.IO').listen(80); io.sockets.on('connection', function (socket) {
io.sockets.emit('this', { will: 'be received by everyone'});
socket.on('private message', function (from, msg) {
console.log('I received a private message by ', from, ' saying ', msg);
}); socket.on('disconnect', function () {
io.sockets.emit('user disconnected');
}); });
例2:
// Server (app.js) var io = require('Socket.IO').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('ferret', function (name, fn) {
fn('woot');
});
}); // Client (index.html)
<script>
var socket = io(); // TIP: io() with no args does auto-discovery
socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
socket.emit('ferret', 'tobi', function (data) {
console.log(data); // data will be 'woot'
});
});
</script>
广播消息
广播消息由服务器发送,会发送给除了当前连接的其他所有客户端。
//发送给除了发送者之外的所有客户端。
socket.broadcast.emit('message',"this is a test");
例:广播用户连接的自定义事件。
var io = require('Socket.IO').listen(80);
io.sockets.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
发送易变(volatile)的数据
volatile 意思大概是说,当服务器发送数据时,客户端因为各种原因不能正常接收,比如网络问题、或者正处于长连接的建立连接阶段。此时会让我们的应用变得 suffer,那就需要考虑发送 volatile 数据。
var io = require('Socket.IO').listen(80); io.sockets.on('connection', function (socket) {
var tweets = setInterval(function () {
getBieberTweet(function (tweet) {
socket.volatile.emit('bieber tweet', tweet);
});
}, 100); socket.on('disconnect', function () {
clearInterval(tweets);
});
});
即使客户端没连线,一样可以这样发送,服务器会自动丢弃发送失败的数据。
命名空间
通过命名空间可以为Socket.IO设置子程序。默认命名空间为“/”,Socket.IO默认连接该路径。
使用of()函数可以自定义命名空间。
// Server (app.js)
var io = require('Socket.IO').listen(80);
var chat = io
.of('/chat')
.on('connection', function (socket) {
socket.emit('a message', {
that: 'only'
, '/chat': 'will get'
}); chat.emit('a message', {
everyone: 'in'
, '/chat': 'will get'
});
}); var news = io
.of('/news')
.on('connection', function (socket) {
socket.emit('item', { news: 'item' });
}); // Client (index.html)
<script>
var chat = io.connect('http://localhost/chat')
, news = io.connect('http://localhost/news');
chat.on('connect', function () {
chat.emit('hi!');
}); news.on('news', function () {
news.emit('woot');
});
</script>
房间
房间是Socket.IO提供的一个非常好用的功能。房间相当于为指定的一些客户端提供了一个命名空间,所有在房间里的广播和通信都不会影响到房间以外的客户端。
进入房间与离开房间
使用join()方法将socket加入房间:
io.on('connection', function(socket){
socket.join('some room');
});
使用leave()方法离开房间:
socket.leave('some room');
在房间中发送消息
在某个房间中发送消息:
io.to('some room').emit('some event');
to()方法用于在指定的房间中,对除了当前socket的其他socket发送消息。
socket.broadcast.to('game').emit('message','nice game');
in()方法用于在指定的房间中,为房间中的所有有socket发送消息。
io.sockets.in('game').emit('message','cool game');
当socket进入一个房间之后,可以通过以下两种方式在房间里广播消息:
//向my room广播一个事件,提交者会被排除在外(即不会收到消息)
io.sockets.on('connection', function (socket) {
//注意:和下面对比,这里是从客户端的角度来提交事件
socket.broadcast.to('my room').emit('event_name', data);
} //向another room广播一个事件,在此房间所有客户端都会收到消息
//注意:和上面对比,这里是从服务器的角度来提交事件
io.sockets.in('another room').emit('event_name', data); //向所有客户端广播
io.sockets.emit('event_name', data);
除了向房间广播消息之外,还可以通过以下API来获取房间的信息。
//获取所有房间的信息
//key为房间名,value为房间名对应的socket ID数组
io.sockets.manager.rooms //获取particular room中的客户端,返回所有在此房间的socket实例
io.sockets.clients('particular room') //通过socket.id来获取此socket进入的房间信息
io.sockets.manager.roomClients[socket.id]
更多API资料,请参考Socket.IO官方文档。另外网络上很多资料是基于0.9版本的,与目前1.0有比较大的区别,请仔细阅读:Migration from 0.9
其他资料:
http://www.csser.com/board/4f5ed68d417a7f6a6e000059
http://raytaylorlin.com/Tech/web/Nodejs/socket-io-tutorial/
http://raytaylorlin.com/Tech/web/Node.js/socket-io-advanced/
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3826251.html
Socket.IO 概述的更多相关文章
- 【socket.io研究】1.官网的一些相关说明,概述
socket.io是什么? 官网的解释是一个实时的,基于事件的通讯框架,可以再各个平台上运行,关注于效率和速度. 在javascript,ios,android,java中都实现了,可以很好的实现实时 ...
- node的socket.io类库概述
socket.io是一个简单的小类库,该类库实现的功能类似于node中的net模块所实现的功能. 这些功能包括websocket通信,xhr轮询,jsonp轮询等. socket类库可以接受所有与服务 ...
- 基于node.js+socket.io+html5实现的斗地主游戏(1)概述
一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...
- 解决Socket.IO在IE8下触发disconnect时间过长
本文地址: http://www.cnblogs.com/blackmanba/p/solve-socketIO-IE8-emit-disconnect-too-long.html或者http://f ...
- 基于react+react-router+redux+socket.io+koa开发一个聊天室
最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...
- websocket 与Socket.IO介绍
一 websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的 ...
- 关于Socket.IO的知识点记录
最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在expres ...
- 前端笔记之微信小程序(四)WebSocket&Socket.io&摇一摇案例&地图|地理位置
一.WebSocket概述 http://www.ruanyifeng.com/blog/2017/05/websocket.html Workerman一款开源高性能异步PHP socket即时通讯 ...
- 轮询以及webSocket与socket.io原理
概述: 首先,我们知道,起初的http协议只是为了能够进行通信而被创造出来(也就是请求-响应的过程).并没有双向通信这一说,后面随着历史业务的需求,人们使用轮询http来解决双向通信也就是使用xhr或 ...
随机推荐
- codeforces C. DZY Loves Sequences
http://codeforces.com/contest/447/problem/C 题意:给你n个数的序列,然后让你改变其中的一个数,求得最长上升连续序列的长度值. 思路:先从左边开始求出连续递增 ...
- 介绍一个好用的软件--多个WIN远程连接
MultiDesk v3.162015-03-16 http://www.syvik.com/multidesk/index_chs.htm MultiDesk 是一个选项卡(TAB标签)方式的远程桌 ...
- Keil C51调试程序时, 对ROM的查看以及RAM 查看或修改
在Keil 里使用 DeBug 模式时,如要 查看外部 RAM 的数据 或查看 ACC 的内容可以进行以下操作; sysGetTxMode: LCALL Com0185(C:2B95) ,sysGet ...
- 15个你不知道的杀手级Google Chrome功能
之前写过一篇我为什么使用Google Chrome浏览器,算是在使用了一段时间的Google Chrome后的一点粗浅认识,最近读到一篇文章15 Killer Google Chrome Featur ...
- Android ActivityManager.killBackgroundProcesses方法去结束
android2.2以后,如果服务在ondestroy里加上了start自己,用kill backgroudprocess通常无法结束自己.有一种最新发现的方法,利用反射调用forceStopPack ...
- 关于sql语句in的使用注意规则( 转)
select * from tuser where userno not in(select userno from filter_barcode) 上面这条语句子查询里,userno 并不存在fil ...
- bzoj1297
首先学习是学习矩阵乘法在邻接矩阵的应用ab两点经过k条边的路径数就等于图的邻接矩阵G的k次幂之后G[a,b]的值但这道题问的是经过长度为k的路径数考虑到每条边的长度最长只有9,所以我们把一个点拆成9个 ...
- Spark(Hive) SQL数据类型使用详解(Python)
Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...
- UVa11090 Going in Cycle!!
UVa11090 Going in Cycle!! 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34650 [思路] ...
- SRM 387(1-250pt)
DIV1 300pt 题意:有m种颜色的球若干个放在n个盒子里.每次操作可从一个盒子里拿出任意个球(不必同色),放进另一个盒子.要求终态为:1.最多有一个盒子里面装有不同色的球,该盒子成为joker ...