基于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)的兴起 ...
随机推荐
- 最近见到的JS返回函数的一些题
JS返回值题一直都是考察重点,面试和笔试之中也经常涉及到,说一说我最近遇到的一些有意思的JS返回函数问题. 之前见到过一道有意思的问题,说有一个sum函数,用户可以通过sum(2,3)来取到2+3 = ...
- 去掉vue地址栏中分隔#问题
你需要开启HTML5 History 模式vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载.如果不想要很 ...
- svn: Can't convert string from 'UTF-8' to native
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt227 svn 版本库中有文件是以中文字符命名的,在 Linux 下 chec ...
- §--------算法分界线--------§
如题 As said in the title~ 计算机的cpu计算从根源上由最基本的逻辑电路(晶体管)组成,由此衍生出最基本的数值运算:四则运算.而此后所有的高级算法都是建立在这个基本计算原理(逻辑 ...
- HIVE和HBASE区别11
对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用. Hive是什么? Apache Hive是 ...
- 201521123072《Java程序设计》第6周学习总结
201521123072<Java程序设计>第6周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画 ...
- Java实现Windows平台下Ping的最佳方法
先上结论:通过调用系统自带的Ping命令来实现,使用exitValue()值来判断Ping的结果.按照惯例,0表示ok,1表示不通. private static void pingTest1() t ...
- 201521123093 java 第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. Runnable不是线程,Thread才是,必须将实现Runnable接口的类的对象放入Thread中才能在 ...
- 201521123014 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库是为了实现一定目的按某种规则组织起来的"数据"的"集合".常见的数 ...
- 201521123110 《Java程序设计》第1周学习总结
第一周学习总结 本周开始了对java的初次学习接触,Java是一门新的编程语言不同于C,由于有了c的基础,对于Java的理解和学习也相对从前学C更容易些. 也学习了Java的诞生发展以及运用包括JVN ...