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