美文网首页node j s程序员Web前端之路
nodejs+socket.io+express实现实时聊天

nodejs+socket.io+express实现实时聊天

作者: 11bcd20e8892 | 来源:发表于2017-10-12 19:49 被阅读114次

项目地址

里面包括前端代码,喜欢实时通信的朋友可以看下,下面截图给大家看看效果。

初始上线后 广播消息

作为朋友项目运行:

需要环境nodejs、npm

1.运行命令npm install

2.运行命令node server

3.在浏览器地址输入:localhost:8088(注意本地不能有8088端口开着,防止端口占用)。

后端server.js代码

const express=require('express');   

const app=express();

const server=require('http').createServer(app);

const io=require('socket.io').listen(server);

const  _=require('underscore');  //underscore库

app.use(express.static('./src'));  //静态资源请求位置

server.listen(8088,(err)=>{

      if(err)

           throw err;

      else{

           console.log('成功监听8088端口');

     }

});

// 检查昵称是否重复  函数

// io.sockets.sockets 返回所有在线的socket对象集合

var checkNickname = function(name){

        for(var k in io.sockets.sockets){

            if(io.sockets.sockets.hasOwnProperty(k)){

                   if(io.sockets.sockets[k] && io.sockets.sockets[k].nickname == name){

                       return true;

                   }

             }

         }

        return false;

}

//在线用户数量

//console.log(io.eio.clientsCount);

/*****

io.eio.clientsCount  // 链接数量

socket.adapter.rooms // 所有房间

socket.nsp.connected // 所有链接

***/

io.on('connection',(socket)=>{

     //用户登录

     socket.on('login',(username)=>{

           if(checkNickname(username)){  //用户名已存在

               socket.emit('nickname');

           }else{

                //socket.id;  唯一

                socket.nickname=username;

                socket.emit('loginSuccess');  //登录成功

                var nums=io.eio.clientsCount;  //在线人数

                io.sockets.emit('system',username,nums,'login');

           }

     });

     //用户断开连接

     socket.on('disconnect',()=>{

         if(socket.nickname!= null){

             var nums=io.eio.clientsCount;  //在线人数

             socket.broadcast.emit('system',socket.nickname,nums,'logout')

         }

    });

    //用户发广播消息

    socket.on('msg',(msg)=>{

           //socket.broadcast.emit('newMsg',socket.nickname,msg);

           //私发消息 _.findWhere(io.sockets.sockets,{nickname:'burt'}).emit();

           io.sockets.emit('newMsg',socket.nickname,msg);

     });

     //用户发广播图片消息

     socket.on('imgMsg',(addr)=>{

           io.sockets.emit('newImg',socket.nickname,addr);

      });

    //用户发广播的本地图片

    socket.on('mySelfImg',(addr)=>{

         io.sockets.emit('mySelfImg',addr);

   });

});

补充,里面可以发本地图片的,另外想要私聊的只需要找到socket.id的对象就行了,

可以这样做私发消息 _.findWhere(io.sockets.sockets,{nickname:'burt'}).emit();

有什么问题可以大家讨论学习交流。

相关文章

网友评论

    本文标题:nodejs+socket.io+express实现实时聊天

    本文链接:https://www.haomeiwen.com/subject/lpioyxtx.html