Nodejs实现多房间简易聊天室功能

1、前端界面代码

  前端不是重点,够用就行,下面是前端界面,具体代码可到github下载。

2、服务器端搭建

  本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制,可将两种服务搭建在同一个端口下。

  1、包描述文件:package.json,这里用到了两个依赖项,mime:确定静态文件mime类型,socket.io:搭建websocket服务,然后使用npm install 安装依赖

  2、http服务器

  http服务主要是给web浏览器提供静态文件,既浏览器发来一个请求,服务器返回一个响应。

var cache={};//缓存静态文件内容
//发送错误响应
function send404(response){
response.writeHead(404,{'Content-Type':'text/plain'});
response.write('Error 4.4:文件未找到。');
response.end();
}
//发送文件内容
function sendFile(response,filePath,fileContents){
response.writeHead(
200,{"content-Type":mime.lookup(path.basename(filePath))}
);
response.end(fileContents);
}
//查找文件
function serveStatic(response,cache,absPath){
if(cache[absPath]){
sendFile(response,absPath,cache[absPath]);
}else{
fs.exists(absPath,function(exists){
if(exists){
fs.readFile(absPath,function(err,data){
if(err){
send404(response);
}else{
cache[absPath]=data;
sendFile(response,data);
}
});
}else{
send404(response);
}
});
}
}
//入口
var server=http.createServer(function(request,response){
var filePath=false;
console.log(new request for ${request.url});
if(request.url==='/'){
filePath='public/index.html';
}else{
filePath='public'+request.url;
}

var absPath='./'+filePath;
serveStatic(response,absPath);
});
server.listen(3000,function(){
console.log("the server is listening on prot 3000.");
});
chatServer.listen(server); //websocket服务也绑定到该端口上

  3、socket服务

  socket.io提供了开箱既用的虚拟通道,所以不需要任务手动转发消息到已连接的的用户,可以使用 socket.broadcast.to(room).emit('message','hello'); room为某个聊天室id

1){ var usersInRoomSummary='Users currently in '+room+' : '; for(var index in usersinRoom.sockets){ if(index!=socket.id){ usersInRoomSummary+=nickNames[index]+','; } } socket.emit('message',{text:usersInRoomSummary}); } } //修改昵称 function handleNameChangeAttempts(socket,namesUsed){ socket.on('nameAttempt',function(name){ if(name.indexOf('Guest')==0){ socket.emit('nameResult',{ success:false,message:'Names cannot begin with "Guest".' }); }else{ if(namesUsed[name]==undefined){ var previousName=nickNames[socket.id]; delete namesUsed[previousName]; namesUsed[name]=1; nickNames[socket.id]=name; socket.emit('nameResult',{ success:true,name:name }); socket.broadcast.to(currentRoom[socket.id]).emit('message',{ text:previousName+' is now known as '+name+'.' }); }else{ socket.emit('nameResult',{ success:false,message:'That name is already in use.' }); } } }); } //将某个用户的消息广播到同聊天室下的其他用户 function handleMessageBroadcasting(socket){ socket.on('message',function(message){ console.log('message:---'+JSON.stringify(message)); socket.broadcast.to(message.room).emit('message',{ text:nickNames[socket.id]+ ': '+message.text }); }); } //加入/创建某个聊天室 function handleRoomJoining(socket){ socket.on('join',function(room){ var temp=currentRoom[socket.id]; delete currentRoom[socket.id]; socket.leave(temp); var num=--allRooms[temp]; if(num==0) delete allRooms[temp]; joinRoom(socket,room.newRoom); }); } //socket断线处理 function handleClientDisconnection(socket){ socket.on('disconnect',function(){ console.log("xxxx disconnect"); allRooms[currentRoom[socket.id]]--; delete namesUsed[nickNames[socket.id]]; delete nickNames[socket.id]; delete currentRoom[socket.id]; }) }

3、客户端实现socket.io

  1、chat.js处理发送消息,变更房间,聊天命令。

  2、chat_ui.js 处理用户输入,根据输入调用chat.js的不同方法发送消息给服务器

').text(message); } function divSystemContentElement(message){ return $('
').html(''+message+''); } function processUserInput(chatApp,socket){ var message=$('#send-message').val(); var systemMessage; if(message.charAt(0)=='/'){ systemMessage=chatApp.processCommand(message); if(systemMessage){ $('#messages').append(divSystemContentElement(systemMessage)); } }else{ chatApp.sendMessage($('#room').text(),message); $('#messages').append(divSystemContentElement(message)); $('#messages').scrollTop($('#messages').prop('scrollHeight')); } $('#send-message').val(''); }

  3、init.js客户端程序初始化 创建一个websocket连接,绑定事件。

').text(message.text); $('#messages').append(newElement); $('#messages').scrollTop($('#messages').prop('scrollHeight')); }); socket.on('rooms',function(rooms){ console.log('rooms:---'+rooms); rooms=JSON.parse(rooms); $('#room-list').empty(); for(var room in rooms){ $('#room-list').append(divEscapedContentElement(room+':'+rooms[room])); } $('#room-list div').click(function(){ chatApp.processCommand('/join '+$(this).text().split(':')[0]); $('#send-message').focus(); }); }); setInterval(function(){ socket.emit('rooms'); },1000); $('#send-message').focus(); $('#send-button').click(function(){ processUserInput(chatApp,socket); }); });

完整代码,可到https://github.com/FleyX/ChatRoom 下载。

以上所述是小编给大家介绍的Nodejs实现多房间简易聊天室功能。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可分享给好友!感谢支持。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希