码迷,mamicode.com
首页 > 其他好文 > 详细

socket服务端的实现

时间:2016-12-15 11:40:19      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:自己   eve   let   roo   require   前台   test   获取   包括   

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.broadcast.emit("msg",{data:"hello,everyone"}); 
//给所有客户端广播消息
io.sockets.emit("msg",{data:"hello,all"});

分组和分组发送消息

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("与服务其断开");
});

项目代码部分:

项目中用到的功能都很简单,最主要的无非就是进入房间、退出房间、然后发送信息这些功能。

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);
};

 

socket服务端的实现

标签:自己   eve   let   roo   require   前台   test   获取   包括   

原文地址:http://www.cnblogs.com/y8932809/p/6182211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!