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





socket.io 消息发送的更多相关文章

  1. Socket.io各个发送消息的含义【发送对象范围】

    Socket.io各个发送消息的含义   // send to current request socket client socket.emit('message', "this is a ...

  2. Socket.io各个发送消息的含义

    // send to current request socket client socket.emit('message', "this is a test"); // send ...

  3. Socket.IO 概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3826251.html ...

  4. node.js中使用socket.io + express进行实时消息推送

    socket.io是一个websocket库,包含客户端的js和服务端的node.js,可以在不同浏览器和移动设备上构建实时应用. 一.安装 socket.io npm install socket. ...

  5. C# Socket异步实现消息发送--附带源码

    前言 看了一百遍,不如动手写一遍. Socket这块使用不是特别熟悉,之前实现是公司有对应源码改改能用. 但是不理解实现的过程和步骤,然后最近有时间自己写个demo实现看看,熟悉熟悉Socket. 网 ...

  6. 基于socket.io的实时消息推送

    用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化, ...

  7. 利用socket.io实现消息实时推送

    最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...

  8. socket消息发送

    expressClient.html <html><head><meta http-equiv="Content-Type" content=&quo ...

  9. 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)

    很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...

随机推荐

  1. 五、DML操作汇总

    前言: DML(Data Manipulation Language)数据操作语言,以INSERT.UPDATE.DELETE三种指令为核心,分别代表插入.更新与删除,是必须要掌握的指令,DML和SQ ...

  2. Android笔记(二十二) Android中的GridView

    GridView和ListView一样,是Android中比较常见的布局控件,譬如我们的手机桌面其实就是一个GridView. 效果: 实现过程和ListView类似,也是通过Adapter将数据源展 ...

  3. python之第一对象,函数名的应用,闭包

    一.第一对象 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数, 还可以当做函数的返回值,这些特性就是第一类对象 ...

  4. PowerMockito单元测试中的Invalid use of argument matchers问题详解

    首先,简单说说PowerMockito进行单元测试的三部曲: 打桩,即为非测试目标方法设置返回值,这些返回值在测试目标方法中被使用.执行测试,调用测试目标方法.验证测试结果,如测试方法是否被执行,测试 ...

  5. LESS简介与使用方法

    less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 一.传统写法与 less 写法对比 1. 传统 css 写法: .con ...

  6. G1垃圾收集器角色划分与重要概念详解【纯理论】

    继续接着上一次[https://www.cnblogs.com/webor2006/p/11129326.html]对G1进行理论化的学习,上一次学到了G1收集器的堆结构,回忆下: 接着继续对它进行了 ...

  7. Hive窗口函数案例详解

    语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...

  8. postgresql学习笔记--基础篇 -psql工具

    --创建用户 CREATE ROLE pguser WITH ENCRYPTED PASSWORD 'pguser'; --创建表空间目录 mkdir -p /database/pg10/pg_tbs ...

  9. MyBatis的关联查询

    关联映射的一对多 //查询经理角色 以及 该角色下对应的员工集合 public SmbmsRole getRoleAndUser(Integer id); <resultMap id=" ...

  10. 在jQuery中使用自定义属性

    在jquery中 自定义属性及值默认以下都是在class='acitve'对象中 进行自定义属性操作:1,自定义属性格式:data-xxxx2,获取该属性值: $('.active').data('x ...