socket.io 消息发送

socket.io学习笔记

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

服务器信息传输html

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会有不一样的链接标示。java

不分组,数据传输

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

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

● io.sockets.emit
信息传输对象为全部client。chrome

分组数据传输

相似于以前提过的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聊天室;bash

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

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

http://www.javashuo.com/article/p-vatajvtw-gk.html

相关文章
相关标签/搜索