socket.io基礎

前言

socket.io是一個跨瀏覽器的支持webSocket的實時通訊的js, 官網地址爲 http://socket.io/docs/

針對api是英文的,再次做了一次翻譯和詮釋

socket.io主要是server.js的編寫,客戶端是機器簡答的寫法,只要引用socket.io.js即可

$ npm install socket.io 使用該命令來安裝socket.io

連接方式

目前有這麼幾種連接方式可供選擇,socket.io單獨連接,配合http模塊,以及配合express框架的使用
1.單獨連接
var io = require('socket.io')(80);  
io.on('connection', function (socket) {  
  socket.on('message', function () { });  
  socket.on('disconnect', function () { });  
});  
2.配合http模塊

var app = require('http').createServer(function (req, res){})  
var io = require('socket.io')(app);  
var fs = require('fs');  
  
app.listen(8076);  
  
io.on('connection', function (socket) {  
  socket.emit('news', { hello: 'world' });  
  socket.on('my other event', function (data) {  
    console.log(data);  
  });  
});  

3.配合express模塊

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);  
  });  
});  

分組

1.此處我們解釋一下socket.io的分組,也即是加入聊天室和在聊天室內進行消息推送

io.on('connection', function(socket){  
    socket.join('family');  
    //房間內所有socket,包括自身  
    io.to('family').emit('some event'):  
    // 房間內所有socket,不包括自身  
    socket.broadcast.to('family').emit('message', {code:1, msg:'family 聊天'});  
})  
使用 socket.leave(data.room);離開聊天室
2.定向推送

/** 定向推送*/  
var users = new Array();  
io.on('connection', function(socket){  
    users.push(socket.id);  
    console.log(users);  
    //給指定的客戶端發送消息  
    io.to(users[0]).emit('message', {msg: '指定聊天'});  
});  

當你看到此處的時候,會發現一個問題,推送消息的時候,api貌似和聊天室有點雷同,確實是這樣的,根據官網的介紹,每個socket連進入以後,都會默認加入一個聊天室,而這個聊天室的名字,就是自己本身的socket.id,所有,在進行推送的時候的api是一樣的

NameSpace多路徑連接

有時候我們會發現一個問題,可能我們不能只設置一個端口,也可能我們很需要/chat /user 等等這樣的連接進行不同模塊之間的通信

/** NameSpace */  
var chat = io.of('/chat').on('connection', function (socket){  
    socket.emit('message', {code:1, msg:'chat 本身'});  
    socket.broadcast.emit('message', {code:2, msg:'chat 所有用戶'});  
    // 下面這句,在分了NameSpace下不會有效果的  
    io.sockets.emit('message', {code:3, msg:'io 所有用戶'});  
    // chat.emit('message', {code:2, msg:'chat 所有用戶'});  
})  
  
var msg = io.of('/msg').on('connection', function (socket){  
    socket.emit('message', {code:1, msg:'msg 本身'});  
    msg.emit('message', {code:2, msg:'msg 所有用戶'});  
})  

注意點:

1.  還有很多時候我們會看到這樣的三個api函數,connection、disconnect、message,這三個api並不是通過socket的on事件進行綁定的,而是在客戶端連接、斷開、              socket.send(data)的時候纔會觸發的三個固定api。

2.  io.sockets.emit('an event sent to all connected clients');
     io.emit('an event sent to all connected clients');

     這兩個api都是像該NameSpace下的所有用戶發送消息(全部包括自身),只存在寫法上的不同。

     而有了不同的NameSpace後,只是形成了像最後一段程序代碼中chat和msg的區別而已了。

3.  凡是使用了socket.broadcast.emit這個api的,都是該socket像其他用戶進行廣播,不包括自己。

4.  而定向發送(房間或單個用戶)只有一個api,那就是io.to(room).emit(),其中的room即可是房間名,也可以是socketId,而廣播和羣發是沒有to這個關鍵字的。


轉發自http://blog.csdn.net/u014201191/article/details/52279195#t3


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章