socket是用來讓瀏覽器和服務器進行實時通信的。之前一般使用定時輪詢的方式來模擬實時通信,但這樣作無疑是增長了服務器的壓力。數組
下面是蒐集的socket.io的一些用法:瀏覽器
服務端部分服務器
io.on(‘connection’,function(socket));//監聽客戶端鏈接,回調函數會傳遞本次鏈接的socket io.sockets.emit(‘String’,data);//給全部客戶端廣播消息 io.sockets.socket(socketid).emit(‘String’, data);//給指定的客戶端發送消息 socket.on(‘String’,function(data));//監聽客戶端發送的信息 socket.emit(‘String’, data);//給該socket的客戶端發送消息
發送消息socket
//給除了本身之外的客戶端廣播消息 socket.broadcast.emit("msg",{data:"hello,everyone"}); //給全部客戶端廣播消息 io.sockets.emit("msg",{data:"hello,all"});
分組和分組發送消息xss
socket.on('group1', function (data) { socket.join('group1'); }); socket.emit(‘group1’) //加入group1分組; //移出分組 socket.leave(data.room); //分組發送消息-不包括本身 socket.broadcast.to('group1').emit('event_name', data); //分組發送消息-包括本身 io.sockets.in('group1').emit('event_name', data)
客戶端函數
//創建一個socket鏈接 var socket = io(「ws://103.31.201.154:5555」); //監聽服務消息 socket.on('msg',function(data){ socket.emit('msg', {rp:"fine,thank you"}); //向服務器發送消息 console.log(data); }); socket.on(「String」,function(data)) //監聽服務端發送的消息 Sting參數與服務端emit第一個參數相同 //監聽socket斷開與重連。 socket.on('disconnect', function() { console.log("與服務其斷開"); });
項目代碼部分:ui
項目中用到的功能都很簡單,最主要的無非就是進入房間、退出房間、而後發送信息這些功能。socket.io
var io = require('socket.io')(); var xssEscape = require('xss-escape'); var userList = []; //用戶列表 //var currentRoom = []//用於存放當前鏈接用戶在哪一個房間的集合; io.on('connection', function (socket) { //監聽鏈接事件,並同時監聽下面四個事件 joinRoom(socket); disconnect(socket); say(socket); close(socket); }); //進入房間 function joinRoom(socket) { socket.on('joinRoom', function (userInfo) { socket.join(userInfo.roomId); //將當前鏈接的用戶添加到指定的roomid房間的socket中 socket.userInfo = userInfo; //爲這個socket添加一個用戶屬性 userList[socket.id] = userInfo;//在用戶列表中,存放當前用戶的信息,由於socket是惟一的 socket.emit('userList', getUserNameList(socket));//向本身傳回當前房間的用戶列表 to(socket.userInfo.roomId). socket.broadcast.to(socket.userInfo.roomId).emit('userJoin', { userId: userInfo.userId, nickName: userInfo.nickName, socketId: socket.id }); //通知其餘用戶有人進入房間 socket.emit('serverMessage', '歡迎進入房間!'); //當進入房間成功以後,向用戶發送一個歡迎信息。 socket.emit("test","test"); }) } //獲取當前房間用戶列表 function getUserNameList(socket) { var nameList = []; //存放當前房間的用戶列表 var usersInRoom = io.sockets.adapter.rooms[socket.userInfo.roomId];//獲取指定房間的信息 for (var socketId in usersInRoom.sockets) { //獲取指定房間內的在線全部用戶對應的socketID if(userList[socketId]!=null) { //將對應的鏈接用戶的信息存到數組中,並返回。 nameList.push({ userId: userList[socketId].userId, nickName: userList[socketId].nickName, socketId: socketId }); //傳遞用戶Id 暱稱 sockedid } } return nameList; } //退出房間 function close(socket) { socket.on('close', function () { socket.leave(socket.id); //離開房間 socket.broadcast.to(socket.userInfo.roomId).emit('userLeave', { //像這個房間內用戶發送用戶離開的通知,前臺會在當前用戶列表中刪除這個用戶 userId: socket.userInfo.userId, nickName: socket.userInfo.nickName, socketId: socket.id }); RemoveNickname(socket.id); //將這我的在用戶列表集合中刪除 }) } //關閉頁面 function disconnect(socket) { socket.on('disconnect', function () { // 當用戶之間關閉頁面時,執行的邏輯和離開房間同樣 socket.leave(socket.id); if (socket.userInfo != null) { socket.broadcast.to(socket.userInfo.roomId).emit('userLeave', { userId: socket.userInfo.userId, nickName: socket.userInfo.nickName, socketId: socket.id }); RemoveNickname(socket.id); } }); } //發消息 function say(socket) { socket.on('say', function (message) { //廣播消息,當前臺發送過來一條消息時,會帶着一個當前房間的id,而後直接向房間內的其餘用戶廣播消息。 content = message.content.trim(); roomid = message.roomId; socket.broadcast.to(roomid).emit('userSay',{title:socket.userInfo.nickName, msg:xssEscape(content)}); //廣播的消息須要xssEscape(content)一下,以防發生腳本攻擊 }); } //刪除房間內的用戶 function RemoveNickname(socketId) { delete userList[socketId]; } exports.listen = function (_server) { return io.listen(_server); };