zoukankan      html  css  js  c++  java
  • 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.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);
    };
  • 相关阅读:
    PL/SQL注册码
    分页sql
    js获取url值
    C语言中的bool类型 stdbool.h
    语音朗读小程序
    50. Pow(x, n)
    二维数组旋转
    用一位数组代替二维数组作为形参使用
    单链表排序——交换数据成员
    C++重载输入流、输出流运算符
  • 原文地址:https://www.cnblogs.com/y8932809/p/6182211.html
Copyright © 2011-2022 走看看