前言
socket.io是一個跨瀏覽器的支持webSocket的實時通訊的js, 官網地址爲 http://socket.io/docs/
針對api是英文的,再次做了一次翻譯和詮釋
socket.io主要是server.js的編寫,客戶端是機器簡答的寫法,只要引用socket.io.js即可
$ npm install socket.io 使用該命令來安裝socket.io
連接方式
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