前言
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