zoukankan      html  css  js  c++  java
  • socket.io 消息发送

    socket.io学习笔记

    1。服务器信息传输;
    2。不分组,数据传输;
    3。分组数据传输;
    4。Socket.io难点大放送(暂时没有搞定);

    服务器信息传输

      1. // 发送到当前请求套接字客户端
      2. socket.emit('message', "this is a test");
      3. // 发送到除发件人以外的所有客户端
      4. socket.broadcast.emit('message', "this is a test");
      5. // 发送到除发送方以外的“游戏”室(频道)中的所有客户端
      6. socket.broadcast.to('game').emit('message', 'nice game');
      7. // 发送到所有客户端,包括发件人
      8. io.sockets.emit('message', "this is a test");
      9. // 发送到“游戏”室(频道)中的所有客户端,包括发件人
      10. io.sockets.in('game').emit('message', 'cool game');
      11. // 发送到单个socketid
      12. io.sockets.socket(socketid).emit('message', 'for your eyes only');
    let sock=io.connect('ws://10.0.0.37:8080/');
    // 进入一个房间 socket.join('room'); // 离开一个房间 socket.leave('room'); //前端触发订阅/退订事件 socket.emit('subscribe',{"room" : "room_name"}; socket.emit('unsubscribe',{"room" : "room_name"}; //后台处理订阅/退订事件 socket.on('subscribe', function(data) { socket.join(data.room); }) socket.on('unsubscribe', function(data) { socket.leave(data.room); })
    
    

    上述集中方式为socket.io常用的数据传输方式,

      1. io.sockets.on('connection', function (socket) {
      2. });
    

    回调函数的socket参数为一个client与服务器的连接标示,不同的client会有不同的连接标示。

    不分组,数据传输

    ● socket.emit
    socket.emit信息传输对象为当前socket对应的client,各个client socket相互不影响。

    ● socket.broadcast.emit
    socket.broadcast.emit信息传输对象为所有client,排除当前socket对应的client。

    ● io.sockets.emit
    信息传输对象为所有client。

    分组数据传输

    类似于之前提过的of方法生成命名空间来管理用户,socket.io可以使用分组方法,socket.join(),以及与之对应的socket.leave()。

      1. io.sockets.on('connection', function (socket) {
      2.     socket.on('firefox', function (data) {
      3.         socket.join('firefox');
      4.     });
      5.     socket.on('chrome',function(data){
      6.         socket.join('chrome');
      7.     });
      8. });
    

    假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作
    socket.emit('firefox'),就可以加入firefox聊天室;
    socket.emit('chrome'),就可以加入chrome聊天室;

    向一个分组传输消息,有两种方式:

      1. socket.broadcast.to('chrome').emit('event_name', data);
      2.   //emit to 'room' except this socket client
      3. io.sockets.in('chrome').emit('event_name', data)
      4.   //emit to all socket client in the room
    

    broadcast方法允许当前socket client不在该分组内。
    可能有一个疑问,一个socket是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“,socket.join()添加进去就可以了。官方提供了订阅模式的示例:

      1. socket.on('subscribe', function(data) { 
      2.     socket.join(data.room);
      3. })
      4. socket.on('unsubscribe', function(data) { 
      5.     socket.leave(data.room);
      6.  })
    

    后台处理订阅/退订事件

      1. socket = io.connect('http://127.0.0.1:1338/');
      2. socket.emit('subscribe',{"room" : "chrome"};
      3. socket.emit('unsubscribe',{"room" : "chrome"};
    

    前端触发订阅/退订事件,就可以加入对应的聊天室。 通过of方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。

    Socket.io难点

    ● 授权验证
    socket连接需要添加权限验证,让已登录的用户socket连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:

      1. io.sockets.authorization(function (handshakeData, callback) {
      2.      callback(null, true);
      3. }).
    

    callback函数有两个参数,第一个为error,第二个参数为是否授权bool值,通过授权回调函数应为callback(null,true),其它情况下都为拒绝建立连接。

    按照web的开发方式,检测是否登录首选cookie-session来实现,问题也是出在这里。websocket握手阶段属于HTTP协议,简单来说是可以读到cookie,就可以实现session。

    精准单用户推送

    理论上来说

     1. // sending to individual socketid
      2. io.sockets.socket(socketid).emit('message', 'for your eyes only');
    

    就可以向一个特定用户推送消息,但是如何获得这个socketId,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。

     

     

    https://www.jianshu.com/p/9f9d1078a881

    https://www.cnblogs.com/liuswi/p/4024319.html

     

     

     

     

     

     

     

  • 相关阅读:
    03构建之法阅读笔记3—团队模式
    软件工程学习进度博客10
    第一阶段冲刺10
    第一阶段冲刺9
    第一阶段冲刺8
    第一阶段冲刺7
    第一阶段冲刺6
    第一阶段冲刺5
    团队项目冲刺第六天
    团队项目冲刺第五天
  • 原文地址:https://www.cnblogs.com/nyfz/p/10626274.html
Copyright © 2011-2022 走看看