socket.io与node.js api 调用示例

本文详细介绍Socket.IO的基础配置、连接管理及前后端数据交互方法。包括客户端和服务端的连接设置、认证流程、命名空间的使用、房间管理和消息发送策略等。

1.本文采用的socket.io.js是2.x版本,测试时请核对版本

2.官方文档链接地址如下
https://socket.io/docs/server-api/
https://socket.io/docs/client-api/
https://socket.io/docs/rooms-and-namespaces/

3.api示例

1.连接方式

客户端新建连接方式

    let socket = io('http://localhost:4000', {
             transports: ['websocket'], query: {
                  token: '123456'
              }
          });

 //transports 为连接方式,默认为长轮询(polling)
 //query 为查询语句,可以传值

服务器端连接方式

const io = require('socket.io')(server(或者端口号), {
  serveClient: false,//是否提供客户端文件
  pingInterval: 10000,//请求间隔时间(ms)
  pingTimeout: 5000,//连接超时时间,超时后自动关闭(ms)
  cookie: false,//禁用缓存
});
//备注:在以前客户端会采用io.connect("ws://localhost:4000/personal");之类的写法,但这样不支持https协议,需改成wss才支持.

2.服务器端建立连接前设定操作

//有很多时候,在建立连接之前我们会有些特殊条件才能建立,比如用户登录等等
//服务器端代码如下,它会在用户建立连接时,优先执行这段代码,可以让我们选择是否建立连接.客户端建立连接代码参考第一点.

io.use((socket, next) => {
  let token = socket.handshake.query.token;
  if (isValid(token)) {
    return next();
  }
  return next(new Error('authentication error'));
});

3.关于前后端数据交互

socket.io采用事件订阅形式进行前后端交互,如
前端:soket.on('方法名',方法体);
后端:io.emit('方法名','传参');

4.命名空间

//我们可以建立命名空间来实现多窗口,多群的互动,示例如下

//客户端创建命名空间连接:
const personalChat = io('/personal');
//const personalChat = io('http://localhost:4000/personal');


//服务器端创建命名空间
const personalChat = io.of('/personal');
personalChat .on('connection',(socket)=>{若干方法});

//服务器端 用户加入某个房间
  socket.join('roomName',方法体});
 //离开某个房间
  socket.leave('roomName',方法体);

//服务器端,某个客户端向房间发送信息(可实现群聊)
  io.to('roomName').emit('调用前端接收信息方法');

5.向指定客户端发送信息

      //服务器端代码
      socket.on('say', (id,msg) => {

      //发送给指定某人id,实现私聊(区别在于,第一种写法发送不到其他命名空间下)
      socket.to(id).emit('msg', msg);
      或
      io.to(id).emit('msg',msg);

      //发送给当前客户端
      socket.emit('msg','msg');

      //全站发送
      io.emit('msg',msg);

      //发送给所有客户端,包含当前客户端
      socket.broadcast.emit('msg', msg);

    });

6.关于重连和断开连接

//服务器端
 socket.on('disconnect', (reason) => {
    // 断开连接自动调用
  });

//数据包是否压缩
socket.compress(true//true 为压缩

//重连,默认情况下,是支持自动连接的,也可以使用socket.open手动打开.
//重新连接事件reconnect_attempt


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值