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页面

说明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的聊天室(实现:加入聊天室、退出聊天室、在线人数、在线列表、发送信息、接收信息)的更多相关文章

  1. nodejs+websocket制作聊天室视频教程

    本套教程主要讲解了node平台的安装,node初级知识.node 服务器端程序响应http请求,通过npm安装第三方包,websocket即时通讯.聊天页面界面制作.拖动原理.拖动效果.遮罩效果.定位 ...

  2. 利用socket.io实现多人聊天室(基于Nodejs)

    socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...

  3. 基于 nodejs 的 webSockt (socket.io)

    基于 nodejs 的 webSockt (socket.io) 理解 本文的业务基础是在基于 nodejs 的 socket.io 的直播间聊天室(IM)应用来的. 项目中具体的 框架如下 expr ...

  4. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  5. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

  6. 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。

    本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...

  7. 基于NodeJS的全栈式开发

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的 NodeJS,试 ...

  8. 基于Nodejs生态圈的TypeScript+React开发入门教程

    基于Nodejs生态圈的TypeScript+React开发入门教程   概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...

  9. (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

    原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...

随机推荐

  1. java 比较几种常见循环方式的优劣

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt224 我们常用for循环,foeach,while等作为循环list或者数组 ...

  2. ArrayBuffer和TypedArray,以及Blob的使用

    前端使用TypedArray编辑二进制 ES6提供了, ArrayBuffer和TypedArray, 让前端也可以直接操作编辑二进制数据, 网页中的类型为file的input标签, 也可以通过Fil ...

  3. 201521123082 《Java程序设计》第8周学习总结

    201521123082 <Java程序设计>第8周学习总结 标签(空格分隔):Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 ...

  4. 201521123107 《Java程序设计》第10周学习总结

    第10周作业-异常与多线程 1.本周学习总结 2.书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有try块中 ...

  5. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.22

    昨天来不及编写,这是4月22日的日志,现在补上. 1.开完站立式会议后的合照 2.任务分解图 3.开会讨论的结果,任务分派 队员 今日进展 明日安排 陈鑫龙 原型设计图分析,设计登陆界面原稿 实现登陆 ...

  6. 201521123096《Java程序设计》第七周学习总结

    1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains遍历了ArrayList,如果ArrayList中存在与o相等的 ...

  7. 201521123073《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  8. Backtrack下的dns爆破工具的目录

    直接可以切换到 /pentest/enumeration/dns#

  9. 201521145048 《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源代码 1.3 结合1. ...

  10. 201521123052 《Java程序设计》 第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 返回的IP地 ...