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这个关键字的。

     熟练记住上面四点,socketIo.js 你就能玩的很溜了 。。。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值