基于nodejs+webSocket的聊天室(实现:加入聊天室、退出聊天室、在线人数、在线列表、发送信息、接收信息)
1 安装 socket.io模块 npm install
"socket.io": "latest"
2 app.js相关
ws = require('socket.io'); //依赖该模块 let server = http.createServer(app).listen(300); //将服务器赋值给变量 let io = ws(server); io.on('connection', function (socket) { //服务器监听'connection'
console.log(socket);
}
3 在创建 public/chat.html
<!--引入的原因:当websocket服务不能用时使用ajax轮查询继续通信-->
<script src="socket.io.min.js"></script> <script>
io.connect('/'); //客户端发起 connect连接
</script>
4 浏览器打开chat.html页面
5 说明websocket通信建立连接成功
6 开始(搞)做(事)聊天室
7 服务器端代码
let userList = {},
usernum = 0;
io.on('connection', function (socket) { socket.on('msg', function (data) { //接收前端发送过来的聊天内容
//console.log(data);
//把有前台发来的内容广播出去
io.emit('chat', data);
});
socket.on('login', function (data) { //服务端监听消息名为login的通信 通过回调函数反应给浏览器
userList[data.userid] = data.name; //给对象userList添加内容
socket.name = data.name; //保留客户端发来的该用户username
socket.userid = data.userid; //保留客户端发来的该用户的userid
usernum++;//登录一个用户+1
data.num = usernum; //给data添加一个num属性并赋值
//console.log(usernum);
io.emit('login',{data:data, userList:userList}); //把加入聊天室的人广播出去
});
// disconnect 退出触发的事件
socket.on('disconnect', function(){
delete userList[socket.userid];//删除退出的用户
usernum--;
console.log(usernum);
io.emit('logout',{name:socket.name, num:usernum, userList:userList});
});
})
8 前台页面代码 --使用jquery库
用户名:<input type="text" class="name"> <button class="join" onclick="Chat.login()">进入聊天室</button>
<div id="con"></div>
<input type="text" class="send-con"><button onclick="Chat.submit()" class="send">发送</button>
<div class="num"></div>
<div class="userlist"></div> <!--引入的原因:当这个服务不能用时使用ajax轮查询继续通信-->
<script src="socket.io.min.js"></script>
<script>
const Chat = {
joinBtn: $('.join'),
sendMsgBtn: $('.send'),
usename: null, //保存用户登录时输入的用户名
userid: null, //保存用户登录时候的id
socket: null, //保存 WebSocket服务
init: function(username){ //初始化
this.socket = io.connect('/'); //客户端发起 connect连接
this.username = username; //给用户名赋值
this.userId = new Date().getTime() +''+ Math.floor(Math.random()*899+100);
this.socket.emit('login', {name: this.username, userid:this.userId}); //向服务端提交名为'login'的信息
this.socket.on('login', function(data){ //监听名为'login'由服务端发来的信息
Chat.updateSystemMsg(data, 'login'); //?? Chat
//console.log(this);
});
//服务端发来'logout'退出信息时
this.socket.on('logout', function(data){
Chat.updateSystemMsg(data, 'logout');
});
//服务端发来 chat的聊天消息
this.socket.on('chat', function(data){
//console.log(data);
Chat.updateSystemMsg(data, 'chat');
});
},
updateSystemMsg: function(data, action){
let $con = $('#con'),
html = $con.html(),
$userList = $('.userlist'),
userList = '',
$num = $('.num'),
numList = $num.html();
//console.log(data);
if(action === 'login'){ //当是登录时候
html += `<p>${data.data.name}进入了聊天室`;
numList = `当前在线人数${data.data.num}`;
$userList.empty();
for(let i in data.userList){
userList += `<p>${data.userList[i]}</p>`;
};
$userList.html('<h3>当前在线列表:</h3>'+userList);
$num.html(numList);
}else if(action === 'logout'){ //当是退出的时候
//console.log(this.username);
html += `<p>${data.name}退出了聊天室`;
numList = `当前在线人数${data.num}`;
$userList.empty();
for(let i in data.userList){
userList += `<p>${data.userList[i]}</p>`;
};
$userList.html('<h3>当前在线列表:</h3>'+userList);
$num.html(numList);
}else if(action === 'chat'){
html += `<p>${data.username}:${data.content}</p>`;
}
$con.html(html);
},
submit: function(){ //发送信息
let $sendMsgInp = $('.send-con'),
sendCon = $sendMsgInp.val();
if(sendCon){ //信息输入框输入的有内容
this.socket.emit('msg', {username:this.username, content:sendCon}); //发送 msg
}else{
alert('发送的内容不能为空');
}
},
login: function(){ //加入聊天室
const $name = $('.name').val();
$name && this.init($name); //$name不为空时 执行后面语句
} }
</script>
基于nodejs+webSocket的聊天室(实现:加入聊天室、退出聊天室、在线人数、在线列表、发送信息、接收信息)的更多相关文章
- nodejs+websocket制作聊天室视频教程
本套教程主要讲解了node平台的安装,node初级知识.node 服务器端程序响应http请求,通过npm安装第三方包,websocket即时通讯.聊天页面界面制作.拖动原理.拖动效果.遮罩效果.定位 ...
- 利用socket.io实现多人聊天室(基于Nodejs)
socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...
- 基于 nodejs 的 webSockt (socket.io)
基于 nodejs 的 webSockt (socket.io) 理解 本文的业务基础是在基于 nodejs 的 socket.io 的直播间聊天室(IM)应用来的. 项目中具体的 框架如下 expr ...
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
- [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建
一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...
- 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...
- 基于NodeJS的全栈式开发
前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的 NodeJS,试 ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
- (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...
随机推荐
- java 比较几种常见循环方式的优劣
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt224 我们常用for循环,foeach,while等作为循环list或者数组 ...
- ArrayBuffer和TypedArray,以及Blob的使用
前端使用TypedArray编辑二进制 ES6提供了, ArrayBuffer和TypedArray, 让前端也可以直接操作编辑二进制数据, 网页中的类型为file的input标签, 也可以通过Fil ...
- 201521123082 《Java程序设计》第8周学习总结
201521123082 <Java程序设计>第8周学习总结 标签(空格分隔):Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 ...
- 201521123107 《Java程序设计》第10周学习总结
第10周作业-异常与多线程 1.本周学习总结 2.书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有try块中 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.4.22
昨天来不及编写,这是4月22日的日志,现在补上. 1.开完站立式会议后的合照 2.任务分解图 3.开会讨论的结果,任务分派 队员 今日进展 明日安排 陈鑫龙 原型设计图分析,设计登陆界面原稿 实现登陆 ...
- 201521123096《Java程序设计》第七周学习总结
1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains遍历了ArrayList,如果ArrayList中存在与o相等的 ...
- 201521123073《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- Backtrack下的dns爆破工具的目录
直接可以切换到 /pentest/enumeration/dns#
- 201521145048 《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源代码 1.3 结合1. ...
- 201521123052 《Java程序设计》 第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 返回的IP地 ...