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 概述,布布扣,bubuko.com

时间: 2024-10-13 14:33:03

Socket.IO 概述的相关文章

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

一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为什么题目直接叫斗地主游戏的原因了. 2.手牌有黑桃A和草花A的两个人一伙:若黑桃A和草花A都在一个人手里,那就自己一伙. 3.开牌之后可以选择亮A或者不亮A,亮A之后队友也应亮明身份,互相配合出牌. 4.随机指定最先出牌者. 5.按照手牌出完顺序记分数,分别记4.3.2.1分,最后整队加和,分数高的队伍获胜.

websocket 与Socket.IO介绍

一  websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协 议草案的不断变化,各个浏览器对协议的实现也在不停的更新.该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了. 1. WebSocket API 首先看一段简单的javascript代码,该代码调用了WebSockets的API.

反向Ajax,第3部分:Web服务器和Socket.IO

英文原文:Reverse Ajax, Part 3: Web servers and Socket.IO 前言 时至今日,用户期待的是可通过web访问快速.动态的应用.这一文章系列展示了如何使用反向Ajax(Reverse Ajax)技术来开发事件驱动的web应用.系列的第1部分介绍了反向Ajax.轮询(polling).流(streaming).Comet和长轮询(long polling).你已经了解了Comet是如何使用HTTP长轮询的,这是可靠地实现反向Ajax的最好方式,因为现有的所有

关于Socket.IO的知识点记录

最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在express框架路由.模板渲染那里看到了Yii2的影子,所以便更加的亲切了.再接着便接触到了websocket,而今天谈论的socket.io 便是websocket的一个类库,说道这里了,我们先去了解下websocket和socket.io: 一  websocket WebSocket是html5新增加的

socket.io与sticky-session, 多个socket.io实例带来的问题

websocket的出现使得从服务器向浏览器推送数据更加容易.但是低版本的浏览器不支持websocket,这时socket.io出现了. 使用socket.io的应用在支持websocket的浏览器运行的时候使用websocket,而在低版本的浏览器中则使用传统的方式与服务器交互(例如long-polling及其他的方式). long-polling的应用实现方式是这样的,客户端向服务器端发起请求,服务器端不会马上返回,而是保持这个连接直到服务器需要推送信息给客户端时,才返回给客户端数据.客户端

socket.io对IE8的支持

默认下载了最新版的socket.io,版本号是1.7.2,对IE8的支持不好,反正在IE8下收发消息都不行.在网上查了很多资料,都解决不了IE8的问题,崩溃. 最后用了一个大家比较认可的版本1.0.6,可以支持IE8: 卸载socket.io npm uninstall socket.io 安装1.0.6版本的socket.io npm install [email protected] 后面的一些版本没有一一的去试,下了一个1.3.7版本的,还是可以支持收发消息的,只是发现IE8在关闭窗口时,

Socket.IO初探

建立Server //server.jsvar io = require('socket.io')(80); var chat = io .of('/chat') //设定命名空间 .on('connection', function (socket) { socket.emit('a message', { //这个只会发送给自己的socket that: 'only' , '/chat': 'will get' }); chat.emit('a message', { //全局发送 ever

【socket.io研究】0.前提准备

WebSocket出现之前,web实时推送,一般采用轮询和Comet技术(可细分为长轮询机制和流技术两种),需要大量http请求,服务器受不了.HTML5定义了WebSocket协议,基于TCP协议,由通讯协议和编程API组成,在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通讯的能力. 建立WebSocket连接的过程是浏览器首先发起一个http请求,在请求头中附带着“Upgrade: WebSocket”头信息,表名申请协议升级,服务器解析后产生应答信息,服务器与客户端的W

【socket.io研究】2.小试牛刀

1.建立个项目,也就是文件夹,这里使用testsocket 2.创建文件package.json,用于描述项目: {     "name":"testsocket",     "version":"0.0.1",     "description":"my first nodejs app",     "dependencies":{         "ex