JSP+Nodejs+Socket.IO 聊天室
来源:互联网 发布:java编写管理系统 编辑:程序博客网 时间:2024/06/06 07:05
前端:JSP+tomcat
聊天服务器:Nodejs自带服务器
通信组件:Socket.io
这个聊天室,实现群组聊天和私聊。
效果图:
nodejs代码
/** * Created by lkt on 15-4-17. */var room = require("../modules/entity/Room.js")function chatSocket(){ return this;}module.exports = chatSocket;chatSocket.Start = function Start(io){ var rooms = new Array(); var userList = new Array(); var userSocketMap = {}; io.sockets.on('connection',function(socket){ //socket.emit('conn',{'value':'hello,welcome!','user':'System'}); //接收用户修改姓名 socket.on('setName',function(data){ var index = userList.indexOf(data.name); if(index==-1){ userList.push(data.name); userSocketMap[data.name] = socket; socket.emit('setName',{'value':'欢迎您! '+data.name,'user':'System','type':'new'}); }else{ socket.emit('setName',{'value':'昵称 '+data.name+' 已经存在!','user':'System','type':'rep'}); } }); //私聊 socket.on('pchat',function(data){ var v = data.value; var tname = v.substring(v.indexOf('@')+1,v.indexOf(']')); console.log(tname); var s = userSocketMap[tname]; s.emit('pchat',{value:data.value,fname:data.fname}); }); //给用户发送房间信息 socket.emit('rooms',{rooms:rooms}); //接收用户创建房间的指令 socket.on('cRoom',function(data){ var repCreate=false; //判断房间是否存在 rooms.forEach(function(r){ if(r.name==data.name){ repCreate = true; } }); if(!repCreate){ leaveMyInRoom(data,socket,rooms); var r = new room(data.name,data.ho); rooms.push(r); socket.join(data.name); socket.emit('rooms',{rooms:rooms,room:data.name,value:'房间 ['+data.name+'] 创建成功!','user':'System'}); //给除了自己以外的客户端广播消息 socket.broadcast.emit('refRooms',{rooms:rooms}); }else{ socket.emit('rooms',{rooms:rooms,room:data.name,value:'房间 ['+data.name+'] 已经存在!','user':'System'}); } // }); socket.on('say',function(data){ var rname = data.room; var ruser = data.user; var rsay = data.value; io.in(rname).emit('say',{value:rsay,'user':ruser}); //socket.emit('say',{value:rsay,'user':ruser}); }); socket.on('leaveRoom',function(data){ console.log(data); leaveMyInRoom(data,socket,rooms); var index = userList.indexOf(data.user); if(index!=-1){ userList.splice(index,1); } socket.broadcast.emit('say',{value:' ['+data.user+']离开了房间!','user':'System'}); io.emit('refRooms',{rooms:rooms}); }); socket.on('joinRoom',function(data){ //是否重复加入 var repJoin = false; leaveMyInRoom(data,socket,rooms); rooms.forEach(function(r){ if(r.name==data.room){ //repJoin = r.getUsers().contains(data.name); repJoin= r.userContains(data.user); if(!repJoin) r.addUser(data.user); } }); if(!repJoin){ socket.join(data.room); socket.emit('say',{value:'欢迎加入 ['+data.room+'] 房间!','user':'System'}); socket.broadcast.emit('say',{value:'欢迎 ['+data.user+']加入房间!','user':'System'}); io.emit('refRooms',{rooms:rooms}); }else{ socket.emit('say',{value:'您已经在 ['+data.room+'] 房间!','user':'System'}); } }); socket.on('disconnect',function(socket){ //console.log(socket.); }); });}function leaveMyInRoom(data,socket,rooms){ //记录房间用户为0的序号 var delRoom = -1; var index = 0; if(data.currRoom!='无'){ socket.leave(data.currRoom); rooms.forEach(function(r){ if(r.name==data.currRoom){ r.removeUser(data.user); if(r.getUsers().length==0){ delRoom = index; } } index++; }); } if(delRoom!=-1){ rooms.splice(delRoom,1); }}
JSP代码:
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>聊天室</title><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel='stylesheet' href='bootstrap-3.2.0-dist/css/bootstrap.min.css' /><link rel='stylesheet'href='bootstrap-3.2.0-dist/css/bootstrap-theme.min.css' /></head><body><div class="container"><div class="row"><div class="col-md-4"><div class="panel panel-default"><div class="panel-heading"><div class="input-group input-group-sm"><span class="input-group-addon">房间</span> <input id="roomName"type="text" class="form-control" placeholder="创建房间"> <spanclass="input-group-btn"><button class="btn btn-default" onclick="createRoom()"type="button">确认</button></span></div></div><table id="rooms" class="table"><tr><th>序号</th><th>房间名</th><th>人数</th><th>房主</th><th>加入</th></tr></table></div></div><div class="col-md-5"><div class="panel panel-default"style="margin-left: auto; margin-right: auto;"><div class="panel-heading"><div id="userDiv" class="input-group input-group-sm"><span id="rTxt" class="input-group-addon">聊天室[]</span> <inputid="username" type="text" class="form-control"placeholder="请输入昵称"> <span class="input-group-btn"><button id="btnNC" class="btn btn-default" onclick="setName()"type="button">确认</button></span></div><div id="headDiv"style="display: none; margin-left: auto; margin-right: auto;">欢迎您[]--当前房间[<span id='headRoomName'></span>]</div></div><div id="chat" class="panel-body"style="height: 500px; overflow: auto;"></div><div class="panel-footer"><div class="input-group input-group-lg"><input type="text" id="sayTxt" class="form-control"> <spanclass="input-group-btn"><button class="btn btn-default" onclick="say()" type="button">发送</button></span></div></div></div></div><div class="col-md-3"><div class="panel panel-default"><div class="panel-heading">房间成员</div><table id="users" class="table"><tr><th>序号</th><th>昵称</th><th>私聊</th></tr></table></div></div></div></div></body><script type="text/javascript" src="lib/jquery-1.9.1.js"></script><script type="text/javascript" src="lib/socket.io-client/socket.io.js"></script><script type="text/javascript"src="bootstrap-3.2.0-dist/js/bootstrap.js"></script><script type="text/javascript">var socket = io.connect("http://localhost:3001");var currRoom = null;var currUser = null;var privateChat = null;/* socket.on('conn',function(data){writeData(data.value,data.user);}); */var map = {};socket.on('rooms',function(data){rooms(data.rooms);var v = data.room==undefined?"无":data.room;currRoom = v;$("#headRoomName").html(currRoom);if(data.value==undefined)return;writeData(data.value,data.user);userList(data.rooms);});socket.on('refRooms',function(data){rooms(data.rooms);userList(data.rooms);});socket.on('say',function(data){writeData(data.value,data.user);});socket.on('setName',function(data){if(data.type=="new"){currUser = $("#username").val();$("#userDiv").hide();$("#headDiv").show();$("#headDiv").html("欢迎您["+currUser+"]--当前房间[<span id='headRoomName'>"+currRoom+"</span>]");}writeData(data.value,data.user);});socket.on('pchat',function(data){writeData(data.value,data.fname);});//设置名称function setName(){var name = $("#username").val();socket.emit('setName',{name:name});}function writeData(value,user){var dir = "";var type = "";var head = "https://gravatar.com/avatar/8b13de3ced1141b167c7ccc0b78ce872?s=50";if(user=="System"){dir = "pull-left";head = "https://gravatar.com/avatar/8b13de3ced1141b167c7ccc0b78ce871?s=50";type = "alert alert-warning";}else if(user==currUser){dir = "pull-right";type = "alert alert-info";}else{dir = "pull-left";type = "alert alert-success";}var s="<div class=\"media\">"+ "<a class=\""+dir+"\" href=\"#\">"+ "<img class=\"media-object img-rounded\" src=\""+head+"\" alt='"+user+"'>"+ "</a>"+ "<div class=\"media-body\">"+ "<div class=\""+type+"\">"+value+"</div>"+ "</div>"+"</div>";$("#chat").html(s+$("#chat").html());}//获取所有房间function rooms(data){var th = "<tr><th>序号</th><th>房间名</th><th>人数</th><th>房主</th><th>加入</th></tr>";$("#rooms tbody").html(th);for(var i=0;i<data.length;i++){var r = data[i];var tr = "<tr><td>"+(i+1)+"</td><td>"+r.name+"</td><td>"+r.users.length+"</td><td>"+r.ho+"</td><td><button class=\"btn btn-default\" onclick=\"joinRoom('"+r.name+"')\" type=\"button\">Go!</button></td></tr>";var tableHtml = $("#rooms tbody").html(); tableHtml += tr; $("#rooms tbody").html(tableHtml);}}//创建房间function createRoom(){var rname = $("#roomName").val();var name = $("#username").val();currUser = name;//currRoom = rname;if(name==""||name==null){alert("请输入用户名");return;}socket.emit('cRoom',{name:rname,ho:name,currRoom:currRoom});}function say(){var say = $("#sayTxt").val();if(currRoom==null||currRoom=="无"){alert("请加入房间!");return;}if(currUser==null){alert("请输入用户名!");return;}var pindex = say.indexOf('@');if(pindex==1){socket.emit('pchat',{value:say,fname:currUser});}else{socket.emit('say',{user:currUser,value:say,room:currRoom});}$("#sayTxt").val("");}function joinRoom(room){var name = $("#username").val();if(room==currRoom){alert("您已经在该房间了!")return;}socket.emit('joinRoom',{room:room,currRoom:currRoom,user:name});currRoom = room;$("#headRoomName").html(room);}function pc(tname){if(tname==currUser){alert("无法私聊自己!");return;}$("#sayTxt").val("[@"+tname+"]");}function userList(rooms){var rs =null;for(var i=0;i<rooms.length;i++){if(rooms[i].name==currRoom){rs = rooms[i];break;}}var th = "<tr><th>序号</th><th>昵称</th><th>私聊</th></tr>";$("#users tbody").html(th);if(rs==null)return;for(var i=0;i<rs.users.length;i++){var r = rs.users[i];var tr = "<tr><td>"+(i+1)+"</td><td>"+r+"</td>"+ "<td><button class=\"btn btn-default\" onclick=\"pc('"+r+"')\" >@!</button></td>"+ "</tr>";var tableHtml = $("#users tbody").html(); tableHtml += tr; $("#users tbody").html(tableHtml);}}$(window).bind('beforeunload',function(){socket.emit('leaveRoom',{currRoom:currRoom,user:currUser});return "确定离开页面";})</script></html>
全部代码:
点击打开链接
0 0
- JSP+Nodejs+Socket.IO 聊天室
- nodejs+socket.io聊天室
- nodejs socket.io 聊天室
- 使用nodejs引用socket.io做聊天室
- nodejs 基于socket.io实现聊天室
- NodeJS和Socket.IO搭建聊天室应用
- Nodejs开发Socket.IO聊天室0821
- nodejs+socket.io实现校内局域网聊天室
- nodejs学习笔记(3)-socket.io打造简易聊天室
- Nodejs实时通讯 在线聊天室(Socket.io)_收藏
- 利用socket.io实现多人聊天室(基于Nodejs)
- Socket.io在线聊天室
- SOCKET IO 网络聊天室
- Socket.io在线聊天室
- Socket.io在线聊天室
- socket.io 网络聊天室
- Socket.io在线聊天室
- 即时通讯之Socket.IO的学习,及使用nodejs 搭建websocket 聊天室
- 基于Keepalived+Haproxy搭建四层负载均衡器
- 第八周——面向对象——窗口初试手
- webservice临时文件heapdump等
- 【已解决】URL里有#号,传参到Servlet时,url编辑器会自动删掉#号之后的所有字符串问题
- ORA-03113: end-of-file on communication channel
- JSP+Nodejs+Socket.IO 聊天室
- Java网络编程从入门到精通(28):获取ServerSocket信息的方法及FTP原理
- 第七周之思维导图
- 《C语言及程序设计》实践参考——由键盘到文件
- txt文件输出实例
- PHP图片压缩显示
- WORDPRESS插件开发(一)HELLO WORLD
- Java开发中的23种设计模式详解
- 《C语言及程序设计》实践参考——文件中的符号个数