node.js之socket.io

创建时间:2013-12-28 20:57:10最后修改:2015-01-15 14:40:47

socket.io官网:http://socket.io

一、使用npm安装socket.io

npm install socket.io
二、使用前必须先require
var socket_io = require("socket.io");
三、listen一个端口或服务
// 直接侦听端口  

var io = socket_io.listen(80);  

      

// 或者是侦听一个服务  

var app = require("http").createServer();  

var io = socket_io.listen(app);  

app.listen(80);
四、服务器端向客户端发送和接收消息
io.sockets.on('connection', function (socket) {    

  // 发送消息  

  socket.emit('news', { hello: 'world' });  

  // 接收消息  

  socket.on('my other event', function (data) {  

    console.log(data);  

  });  

});
五、客户端连接服务器、接收和发送消息
$(function(){  

    var socket = io.connect('http://localhost:80');  

    socket.on('connect', function () {  

        socket.on('news', function (data) {  

            console.log(data);  

            socket.emit('my other event', { my: 'data' });  

        });  

    });  

});

六、socket.io配置

socket.io有4个修改配置的API:io.configure, io.set, io.enable, io.disable,其中io.configure可以针对不同的环境进行不同的配置,io.set对单个配置项进行配置,io.enable和io.disable对boolean型的配置项进行配置,如:

io.configure('development', function(){
    io.enable('browser client etag');
    io.set('log level', 1);
});

io.configure('release', function(){
    io.set('transports', ['websocket']);
});

下面是socket.io的一些常用的配置项:

  • transports(默认['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']):一个包含通信方法类型的数组。Socket.IO支持多种实现在线即时通信的方式,如websocket、polling等等,该配置能让你自行选择备用的通信方式。
  • log level(默认3):日志输出的最低级别,0为error,1为warn,2为info,3为debug,默认即输出所有类型的日志。
  • heartbeat interval(默认25秒):心跳包发送间隔,客户端需要在此时间段之内向服务器发送一个心跳包才能保持通信。

七、socket.io的房间功能
如果你要用socket.io做类似聊天室的产品,socket.io提供了一个非常方便的房间功能,每个房间相当于命名空间的东西,可以针对单个房间发消息而不影响其他房间。
1、进入和退出房间
socket.join('room name')可用于客户端进入房间,socket.leave('room name')用于退出房间。room name是我们可以自定义的房间名称:
io.sockets.on('connection', function (socket) {
    console.log("join room");
    socket.join("room name");

    socket.on("disconnect", function (){
        console.log("leave room");
        socket.leave('room name');
    });
});
2、向房间广播事件
//1. 向my room广播一个事件,提交者会被排除在外(即不会收到消息)
io.sockets.on('connection', function (socket) {
    //注意:和下面对比,这里是从客户端的角度来提交事件
    socket.broadcast.to('my room').emit('event_name', data);
}

//2. 向another room广播一个事件,在此房间所有客户端都会收到消息
//注意:和上面对比,这里是从服务器的角度来提交事件
io.sockets.in('another room').emit('event_name', data);

//向所有客户端广播
io.sockets.emit('event_name', data);
3、获取房间信息
//获取所有房间的信息
//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]

4、socket.io内置的一些默认事件

服务器端事件:

  • io.sockets.on('connection', function(socket) {}):socket连接成功之后触发,用于初始化
  • socket.on('message', function(message, callback) {}):客户端通过socket.send来传送消息时触发此事件,message为传输的消息,callback是收到消息后要执行的回调
  • socket.on('anything', function(data) {}):收到任何事件时触发
  • socket.on('disconnect', function() {}):socket失去连接时触发(包括关闭浏览器,主动断开,掉线等任何断开连接的情况)
客户端事件:
  • connect:连接成功
  • connecting:正在连接
  • disconnect:断开连接
  • connect_failed:连接失败
  • error:错误发生,并且无法被其他事件类型所处理
  • message:同服务器端message事件
  • anything:同服务器端anything事件
  • reconnect_failed:重连失败
  • reconnect:成功重连
  • reconnecting:正在重连
在这里要提下客户端socket发起连接时的顺序。当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。

5、授权
  • 向所有客户端广播:socket.broadcast.emit('broadcast message');
  • 进入一个房间(非常好用!相当于一个命名空间,可以对一个特定的房间广播而不影响在其他房间或不在房间的客户端):socket.join('your room name');
  • 向一个房间广播消息(发送者收不到消息):socket.broadcast.to('your room name').emit('broadcast room message');
  • 向一个房间广播消息(包括发送者都能收到消息)(这个API属于io.sockets):io.sockets.in('another room name').emit('broadcast room message');
  • 强制使用WebSocket通信:(客户端)socket.send('hi'),(服务器)用socket.on('message', function(data){})来接收。