前言
在網上看到有人總結的 JS 的 Socket.IO 庫發送消息的相關資料,覺得很不錯,在這里做下整理與轉載。
Socket.IO 發送消息的不同含義
...
// 給本次連接的客戶端發消息
socket.emit('hello', 'can you hear me?', 1, 2, 'abc');
// 給除了本次連接的其他所有連接者發消息
socket.broadcast.emit('broadcast', 'hello friends!');
// 給除了本次連接者之外的所有game房間的人發消息
socket.to('game').emit('nice game', "let's play a game");
//給除了本次連接者之外的所有game1、game2房間的人發消息
socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");
// 給所有game中的人發消息
io.in('game').emit('big-announcement', 'the game will start soon');
// 給myNamespace命名空間的所有人發消息
io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon');
//給特定的socketid發消息(私信)
socket.to(<socketid>).emit('hey', 'I just met you');
// 發送需要回執的消息
socket.emit('question', 'do you think so?', function (answer) {});
// 發送無需壓縮的消息
socket.compress(false).emit('uncompressed', "that's rough");
// sending a message that might be dropped if the client is not ready to receive messages
socket.volatile.emit('maybe', 'do you really need it?');
// sending to all clients on this node (when using multiple nodes)
io.local.emit('hi', 'my lovely babies');
...
Socket.IO服務端消息與客戶端對應的處理方法
-
case 1
發送 action 命令,命令是字符串的。代碼如下:
socket.emit('action');
在另一端接收時,可以寫成:
socket.on('action',function(){...});
-
case 2
送了一個action命令,還有data數據。代碼如下:
socket.emit('action', data);
在另一端接收時,可以寫成:
socket.on('action',function(data){...});
-
case 3
發送了action命令,還有兩個數據,代碼如下:
socket.emit(action,arg1,arg2);
在另一端接收時,可以寫成:
socket.on('action',function(arg1,arg2){...});
-
case 4
在emit方法中包含回調函數,例如:
socket.emit('action',data, function(arg1,arg2){...} );
這里的回調函數也可以在另一端調用,另一端可以寫成:
socket.on('action',function(data,fn){ fn('a','b') ; });
上面的data數據可以有0個或者多個,相應的,在另一端改變function中參數的個數即可,即使參數個數與發送端的data個數一一對應。另外,function中的參數個數和順序應該和發送時保持一致。
對於上面最后一個case,fn是一個特別的參數,其特別處是它本身是一個函數,fn相當於執行了回調函數。需要特別注意的是,一次發送不應該寫多個回調函數,否則只有最后一個有效。而且回調應作為最后一個參數。
參考
- https://blog.csdn.net/iflashigame/article/details/78024877
- https://blog.csdn.net/h330531987/article/details/78257517