socket服務端的實現

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);
};
相關文章
相關標籤/搜索