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');
// 进入一个房间
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 socketid2. 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

转载于:https://www.cnblogs.com/nyfz/p/10626274.html

socket.io 消息发送相关推荐

  1. linux命令 socket,如何从linux中的命令行向socket.io websocket发送消息?

    是否可以使用linux中的命令行向我的localhost服务器(节点)发送socket.io消息?我不确定这是否可行--从稀缺的谷歌搜索结果来看,我猜这不可能或不复杂-- 我的socket.io代码如 ...

  2. linux 发送socket命令,如何从linux中的命令行向socket.io websocket发送消息?

    小智.. 10 您可以编写一个这样的简单客户端(让我们命名它client没有扩展名): #!/usr/bin/env node const socket = require('socket.io-cl ...

  3. 突袭HTML5之WebSocket入门3 - 通信模型socket.io

    为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程 ...

  4. 调用ice服务器_Nodejs+socket.io搭建WebRTC信令服务器

    前言 我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了. 对于 WebRTC 来说,它有一整套规范,如使它使用的接口.使用SDP进行媒体协商.通过ICE收集地址并 ...

  5. Nodejs+socket.io搭建WebRTC信令服务器

    前言 我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了. 对于 WebRTC 来说,它有一整套规范,如使它使用的接口.使用SDP进行媒体协商.通过ICE收集地址并 ...

  6. 《 Socket.IO》 解决 WebSocket 通信

    大家好呀,我是小菜~ 本文主要介绍 Socket.IO 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 在介绍 Socket.IO 之前, 我们先考虑一个问题, 如果这个时候有个需求, 类似实 ...

  7. node服务器给客户端发消息,上的node.js发送消息客户端 - 服务器 - 客户端上socket.io(Sen...

    我使用的NodeJS + Socket.IO简单的网页游戏. 有用. 为什么? 这里是我的server.js var app = require('express').createServer(); ...

  8. 简单的nodejs+socket.io给指定的人发送消息

    最近学习了一下socket.io,不太会用,所以做了一个小demo理一下思路. 主要目的是实现向某个指定的用户发送消息,也就是服务端单独推送信息给某个人.具体的思路就是每个在线的用户都对应一个sock ...

  9. socket.io简易教程(群聊,发送图片,分组,私聊)

    什么是Socket.io? 过去: 由于http是无状态的协议,所以实现聊天等通信功能非常困难,当别人发送一条消息时,服务器并不知道当前有哪些用户等着收消息,所以以前实现聊天通信功能最普遍的就是轮询机 ...

  10. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

最新文章

  1. vc6.0报delete and rebuild Error executing link.exe.错误
  2. 用计算机计算器课程,信息技术学科“神奇的计算器”教学设计
  3. Interview:算法岗位面试—上海某科技公司算法岗位(偏AI算法,国企)技术面试之BN层的认知、BP的推导、GD优化的几种改进等
  4. 开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
  5. 快约 - PHP社交约会平台源码开心版
  6. python读取一个目录下的文件名(不会递归往下读)
  7. python读取文件_一日一技:使用Python读取Excel文件
  8. 自制系统垃圾清理BAT小工具
  9. element ui 分页增删改查_【新插件发布】AzureAD运维Excel版插件,增删改查快10倍c以上!...
  10. 植保飞行器(G 题)--2021 年全国大学生电子设计竞赛
  11. 射频芯片,最全介绍!
  12. 国内国外很火爆的代码生成器
  13. ONOS 南向抽象层分析
  14. Qt 3D 官方实例1 simple-qml
  15. 营养与心理的眼睛保健方法
  16. 每周全球科技十大新闻(2021.6.21-6.27)
  17. 网上教务评教管理系统(教学评价系统)
  18. 常用的十种算法:二分查找,分治,动态规划,KMP
  19. Python(arcpy) 批量计算流域面积
  20. 学习linux下破解wifi密码

热门文章

  1. 如何让 Pages 文字分为两栏或更多栏?
  2. Mac 计算器隐藏功能,满足你所有计算要求
  3. Audio Hijack 4 for Mac(音频录制工具)
  4. 如何禁用 MacBook 在打开盖子时自动启动功能
  5. 如何使用iMovie对抖动视频进行防抖处理?
  6. 如何将Safari中保存的密码导入Chrome ?
  7. MacOS的OCR文字识别,节约时间,提高效率
  8. dva开发一个cnode网站(2)
  9. Laravel Symfony_Crawler GuzzleHttp 爬虫 抓取行政区域
  10. 面试没过的程序员都到哪去了?