一看就会的node聊天室案例,socket.io实现多人聊天

实例效果:

一看就会的node聊天室案例,socket.io实现多人聊天_第1张图片

一看就会的node聊天室案例,socket.io实现多人聊天_第2张图片

实例效果:

1 用户登录以后,进入群聊界面。顶部显示在线人数

2 每次有新用户进入以后,顶部在线人数加1,界面提示该用户加入群聊,离开时减1,界面提示该用户离开

同时小气泡显示进入来的用户名称

3 用户登录进入以后输入内容点击提交内容会在界面显示出来。并且显示发送人和发送的内容

项目结构:

-----  node_modules

------socket

         chart.html

-------chart.js

根目录下有一个chart.js文件。即为该demo启动的服务器文件

/socket/chart.html页面代码:

Document

当前在线人数:

    ----------------------------------后端chart.js代码-----------------------------------------------

    var fs=require("fs");

    var http=require("http");

     

    var server=http.createServer(function(req,res){

    var stream=fs.createReadStream("./chart4.html");

    stream.setEncoding("utf8");

    stream.pipe(res)

    }).listen(9999);

     

    var count=0

    var nickArr=[];

    var io=require("socket.io").listen(server);

     

    io.sockets.on("connection",function(socket){

    socket.on("nickname",function(data,callback){

    console.log("接收客户端nickname:",data)

    if(nickArr.indexOf(data)!==-1){

    console.log("false")

    callback(false)

     

    }else{

    console.log("true")

    count++;

    callback(true);

    socket.nickname=data;

    nickArr.push(data);

    io.sockets.emit("nicknames",{

    nickArr:nickArr,

    name: data ,

    count:count,

    isLogin:true

    })

    }

    })

     

    socket.on("userMsg",function(data){

    console.log("服务端的usermsg:",data)

    io.sockets.emit("userMsg",{

    nick:socket.nickname,

    msg:data

    })

    })

    socket.on("disconnect",function(){

    if(!socket.nickname){

    return

    }else{

    nickArr.splice(nickArr.indexOf(socket.nickname),1);

    count--;

    console.log("退出以后count是:",count)

    io.sockets.emit("nicknames",{

    nickArr:nickArr,

    name: socket.nickname ,

    count:count,

    isLogin:false

    })

     

    }

    })

     

    })

    代码很简单。注意点如下:

    1在用户离开和进入的时候,界面提示xx用户进入/离开,其实dom操作差不多,那么如何复用,如何判断当前用户是离开开始进入呢?我们在服务器的每次发送nicknames事件给前端的时候加一个isLogin字段,这样前端在接受的时候结可以通过该值进行判断

    2在登录的时候。可能存在名称一致的情况,那如何规避这个问题,在服务器的nickname事件中,我们通过数组中是否存在用户输入的名称的方式来判断,确认是否存在之后通过传入一个回调函数,把true/false通过值传给客户端以后,在客户端的nickname事件中通过socket.emit("nickname",nickInput.value,function(flag){

      if(falg){

    }else{

    }

    }来进行判断

     

    你可能感兴趣的:(node)