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

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM