里面包括前端代码,喜欢实时通信的朋友可以看下,下面截图给大家看看效果。
作为朋友项目运行:
需要环境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();
有什么问题可以大家讨论学习交流。
网友评论