为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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 概述的更多相关文章

  1. 【socket.io研究】1.官网的一些相关说明,概述

    socket.io是什么? 官网的解释是一个实时的,基于事件的通讯框架,可以再各个平台上运行,关注于效率和速度. 在javascript,ios,android,java中都实现了,可以很好的实现实时 ...

  2. node的socket.io类库概述

    socket.io是一个简单的小类库,该类库实现的功能类似于node中的net模块所实现的功能. 这些功能包括websocket通信,xhr轮询,jsonp轮询等. socket类库可以接受所有与服务 ...

  3. 基于node.js+socket.io+html5实现的斗地主游戏(1)概述

    一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...

  4. 解决Socket.IO在IE8下触发disconnect时间过长

    本文地址: http://www.cnblogs.com/blackmanba/p/solve-socketIO-IE8-emit-disconnect-too-long.html或者http://f ...

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

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

  6. websocket 与Socket.IO介绍

    一  websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的 ...

  7. 关于Socket.IO的知识点记录

    最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在expres ...

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

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

  9. 轮询以及webSocket与socket.io原理

    概述: 首先,我们知道,起初的http协议只是为了能够进行通信而被创造出来(也就是请求-响应的过程).并没有双向通信这一说,后面随着历史业务的需求,人们使用轮询http来解决双向通信也就是使用xhr或 ...

随机推荐

  1. netsat -ano 查看已占用的端口以及tomcat出现端口被占或者启动失败问题

    A.在DOS命令下:输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后 ...

  2. Samara SAU ACM ICPC 2013-2014 Quarterfinal Qualification Contest

    A: 简单题,因为题目中说了不会有数据相同: #include<cstdio> #include<algorithm> #define maxn 200005 using na ...

  3. Psychos in a Line

    Codeforces Round #189 (Div. 1) B:http://codeforces.com/problemset/problem/319/B 题意:每一ROUND如果某个人的数字大于 ...

  4. KeilC51使用详解 (三)

    C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统. 第一节 本征库函数(intrinsic rou ...

  5. UI设计师的 Android 备忘录

    Images and themes Nine-patch Colors Holo themes Naming conventions Naming conventions for drawables ...

  6. 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器

    14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...

  7. python读取文件通过正则过滤需要信息然后保存到新文件里

    import osimport reimport fileinput def getDataFromFile():        rt = "/(.*)/(.*).apk"     ...

  8. TortoiseSVN优化设置

    设置log messages的字体 TortoiseSVN默认的字体太小了,看着难受: 可以在Settings > 左侧目录树General > Dialogs 1中进行设置: 使用Bey ...

  9. reloadData should be in main thread

    reloadData should be called in main thread, so if you call it in work thread, you should call it as ...

  10. linux驱动开发之GCC问题

    最近正在学习驱动开发,进展到字符设备驱动开发阶段. 先不多说,首先把刚看的一篇学习驱动步骤的帖子记录如下: 1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. ...