为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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. Git 忽略已经提交的文件

    如果想在本地忽略某个文件的话执行这个命令: git update-index --assume-unchanged <file> 如果想重新同步这个文件的话执行这个命令. git upda ...

  2. node案例

    http://www.cnblogs.com/wewe/archive/2010/03/19/1685658.html http://www.laonan.net/blog/69/ http://cn ...

  3. insert时出现主键冲突的处理方法【转载】

    原文出处:http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html 使用"insert into"语句进行 ...

  4. Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)

    概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...

  5. Windows多桌面切换(CreateDesktop,SwitchDesktop函数)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. C++必备知识

    新进C++程序员应在一年内完成学习“basic”类别知识点,两年内完成学习“advance”类别知识点,三到四年内完成学习“expert”1.基础(Basic)(1)变量与基本类型:(2)typede ...

  7. Android与服务器端数据交互(http协议整合struts2+android)

    在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有 一:基于Http协议获取数据方法 ...

  8. win7 下与mac虚拟机的共享文件的建立

    1. 确保针对Mac虚拟机的VMware Tools的安装 加载进入系统后,在mac里可看到安装和卸载vmware tools的两个图标(点开vmware tools磁盘),点安装的就可以了. 2. ...

  9. Features of Spring Web MVC

    21.1.1 Features of Spring Web MVC Spring Web Flow Spring Web Flow (SWF) aims to be the best solution ...

  10. 动态规划(树形DP):HDU 5886 Tower Defence

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAERCAIAAAB5Jui9AAAgAElEQVR4nOy9a6wsS3YmFL/cEkh4LP