• node+websocket+react即时匿名通讯聊天室


    mark

    依赖文件如下:
    node安装express3.X
    websocket模块socket.io
    数据库mongodb 数据库模块mongoose 直接扔代码:

    #后台代码
    //websocket
    var apps = express();
    var server = require('http').Server(apps);
    var io = require('socket.io')(server);
    server.listen(3001);//注意这个不是程序的端口号:是socket的端口号
    io.on('connection', function (socket) {
    //接受数据请求
    //操作数据库
    var Cat=mongoose.model('Cat',testSchema);
    var Getlist=mongoose.model('Getlist',txtdb);
    var roomID=0;
    socket.on('join',function(data){
        var info={
            err:null,
            username:'',
            msg:'',
            rname:''
        };
        if(data.token==''||data.token=="undefined"){
            info.err=2;  //没有token
            info.msg="没有token";
            socket.emit('new',info);
            return false;
        }
        //判断是否存在房间
        Cat.find({"cryptoCode":data.token},function(err,docs){
            if(docs.length>0){
                info.rname=docs[0].name;
                info.username='匿聊'+Math.floor(Math.random()*999+1);
                roomID=data.token.split('-rn');
                socket.join(roomID); //加入房间
                //查询前10条用户数据
       Getlist.find({"code":data.token}).sort({_id:-1}).limit(10).exec(function(errs,doc){
                    info.err=0; //正确状态
                    info.msg="数据正确";
                    doc.reverse();
                    if(errs){
                        return false;
                    }
                    info.list=doc;
                    socket.emit('new',info);
                });
            }else{
                info.err=1; //没有对应的房间
                info.msg="没有对应的房间";
                socket.emit('new',info)
            }
        });
    });
    socket.on('message',function(data){
        var time=new Date();
        var nowtime=time.getTime();
        var Savedata=new 
       //操作mongodb数据库      Getlist({"username":data.username,"rname":data.rname,"txt":data.txt,"code":data.code,"time":nowtime});
        Savedata.save(function(err){
            if(err){
                return false;
            }
            io.to(roomID).emit('msg',data); //给指定房间推送系统
        })
    });
    #前台代码
    //socket
        var token=this.props.location.query.token;  //react获取url参数 
        var _this=this;
        var socket = io.connect('服务器ip:3001');
        socket.emit('join', { token: token });
        socket.on('new',function(data){
            if(data.err==0){
                _this.setState({
                    username:data.username,
                    list:data.list,
                    rname:data.rname
                });
            }else if(data.err==2){
                window.location.hash='#/';  //没有token跳回首页
            }else{
                alert(data.msg);
            }
        });
        socket.on('msg',function(data){
            _this.state.list.push(data);
            var setlist=_this.state.list;
            _this.setState({
                list:setlist
            })
        });

    以上是前后端的代码,小sam写的不好的大神路过请多多指教……

    总结一下,如果会node的人来说,那么主要的是socket的应用了。前端也不一定要用react...普通的html也能实现,这个就看每个人的习惯……

    socket.io的主要一些方法总结:
    socket.on()//监听信息,主要两个参数,1.监听的对象名称。2.回调函数 
    socket.emit()//推送信息,主要两个参数,1.监听的对象名称。2.回调函数 
    io.to(roomID).emit('msg',data); //给指定房间推送系统 
    io.join()//加进当前房间
  • 相关阅读:
    HTML5+php图片自由裁剪上传功能
    一个日期时间显示框的美化风格示例
    PHP+jquery 瀑布流+LightBox图片盒子特效
    类型
    异常语句
    穷举
    练习
    累加求和
    猜拳游戏(三局两胜)
    正则表达式
  • 原文地址:https://www.cnblogs.com/samsimi/p/6547379.html
Copyright © 2020-2023  润新知