关于socket.io的使⽤
原⽂地址:
这段时间学习了socket.io,⽤它写了⼩项⽬,在此总结下它的基本使⽤⽅式和⼀些要点。
socket.io是基于Node.js和WebSocket协议的实时通信开源框架,它包括客户端的JavaScript和服务器端的Node.js。
服务端
这⾥后端使⽤的框架是koa2,socket.io将⾃⾝绑定到koa的进程中去,其中最重要的事件就是 connection 和 disconnect。它们是框架本⾝定义的系统事件,也就意味着它是⾃然就存在的不需要我们⾃定义,当然还有其它系统事件,但很少会⽤得到。
const koa = require('koa')
const app = new koa()
const server = require('http').createServer(app.callback())
const io = require('socket.io')(server)
//监听connect事件
<('connection', socket => {
console.log('connected');
//监听disconnect事件
<('disconnect', () => {
console.log('disconnect')
}
});
server.listen(3001);
客户端
web端直接传⼊url地址即可,其中这⾥监听的 open 事件是⽤户⾃定义的,对应服务端的则是发送open事件。
import io from 'socket.io-client';
//建⽴websocket连接
const socket = io('127.0.0.1:3001');
//收到server的连接确认
<('open', () => {
showTip('socket io is open !');
init();
});
emit 和 on
emit 和 on 是最重要的两个api,分别对应发送和监听事件。
<(eventName, callback):监听⼀个 emit 发射的事件
我们可以⾮常⾃由的在服务端定义并发送⼀个事件emit,然后在客户端监听 on,反过来也⼀样。
发送的内容格式也⾮常⾃由,既可以是基本数据类型 Number,String,Boolean 等,也可以是 Object,Array 类型,甚⾄还可以是函数。⽽⽤回调函数的⽅式则可以进⾏更便携的交互。
/*** 服务端 **/
<('message',data =>{
console.log(data)
});
/*** 客户端 **/
<('send',data =>{
console.log(data);
});
//回调函数
/*** 服务端 **/
<('sayit', (word, callback)=> {
callback('say ' + word);
});
/*** 客户端 **/
console.log(data); // say wow
});
broadcast ⼴播
broadcast 默认是向所有的socket连接进⾏⼴播,但是不包括发送者⾃⾝,如果⾃⼰也打算接收消息的话,需要给⾃⼰单独发送。
/*** 服务端 **/
<('connection', socket => {
const data= {
txt:'new user login',
time:new Date()
}
//⼴播向所有socket连接
it('userin',data);
//给⾃⼰也发⼀份
});
namespace 命名空间
如果你想隔离作⽤域,或者划分业务模块,namespace 是个有效的法⼦。namespace 相当于建⽴新的频道,你可以在⼀个 socket.io 服务上⾯隔离不同的连接,事件和中间件。
默认的连接也是有namespace的,那就是 /;
使⽤命名空间的⽅式⼀:直接在链接后⾯加⼦域名,这种其实⽤的还是同⼀个 sokcet 服务进程,可以看成是软隔离吧。
/*** 客户端 **/
import io from 'socket.io-client';
//默认的namespace
const socket = io('127.0.0.1:3001');
// mypath
const socket = io('127.0.0.1:3001/mypath', { forceNew: true });
/*** 服务端 **/
//默认的namespace
<('connection', socket => {
});
// mypath
io.of('/mypath').on('connection', socket => {
});
使⽤命名空间的⽅式⼆: path 参数,这种就是实打实的重新起了⼀个 socket 服务了。
/*** 客户端 **/
const socket = io('localhost', {
path: '/mypath'
});
/*** 服务端 **/
// 另外重新起socket服务
const io = require('socket.io')({
path: '/mypath'
});
middleware 中间件
socket.io 的中间件和 kao2 的⾮常相似,这意味着我们可以在变动很⼩的情况下,将koa2的中间件改造为 socket.io 所⽤。
const mypath = io.of('/mypath').on('connection', socket => {
<('message', data => {
});
});
//中间件
const auth = (socket, next) => {
const data = quest;
if(!verify(data)){
throw new Error('not verify');
}
next();
}
// mypath 这个 namespace 注册中间件
mypath.use(auth);
rooms
每⼀个socket连接都会有⼀个独⼀⽆⼆的标志,那就是 socket.id,我们就是通过id来区分不同连接的。除此之外,socket.id 本⾝也是房间room 的标志,通俗讲,每个socket 连接⾃⾝都拥有⼀间房 room。那么我们就可以给这个 room 发送消息,还有如果你加⼊了房间,就能接受到房间⾥的⼴播信息。当然你可以⾃定义 room ,让socket连接加⼊或离开。还有如果 socket 断开连接,也就是 disconnect 后,它会被⾃动移出room。
⽽这就是实现单独聊天和组聊天的基础,来看⼀下对应的api。
socket.join(rooms[, callback]):加⼊房间
socket.leave(room[, callback]) :离开房间
<(room):给房间发送消息
// ⾃定义room
<('connection', socket =>{
socket.join('some room')); // 加⼊房间
socket.leave('some room'); // 离开房间
websocket和socket
});
// 向房间⾥的所有客户端发送消息
<('some room').emit('some event');
// 默认房间(每⼀个id⼀个room)
<('say to someone', (id, msg) => {
(id).emit('my message', msg);
});
总结
相信有了以上介绍的基础知识,再加上官⽹对应的⽂档,要开发聊天室或者其他实时通信的项⽬,是⼀件易如反掌的事情
⾥⾯有对 api ⾮常详细的讲解和⽤例。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。