express框架实现基于Websocket建立的简易聊天室


Posted in Javascript onAugust 10, 2017

最近想写点有意思的,所以整了个这个简单的不太美观的小玩意

首先你得确认你的电脑装了node,然后就可以按照步骤 搞事情了~~

1.建立一个文件夹

2.清空当前文件夹地址栏,在文件夹地址栏中输入cmd.exe

3.我们需要下载点小东西 ,需要在命令行输入

  • npm install express 回车 等待一会
  • npm install express-session 回车 等待一会
  • npm install ejs 回车 等待一会
  • npm install socket.io 回车 等待一会 叮~~~ 搞定!!!

4.安装完成后,在你建的文件夹下 就会有一个 node_modules文件夹,接下来我们还需要建立俩文件夹,一个文件夹(public)存放静态资源,并且添加jquery文件,一个文件夹(views)存放静态模板ejs文件。

5.接下来我们就需要建立一个入口文件(app.js),在你建立的文件夹下 。

6.app.js中必须写的

var express=require('express');
var app=express();


//加载express web server
var http=require('http').Server(app);
//加载websocket server-->http://localhost:3000/socket.io/socket.io.js
var io=require('socket.io')(http);
//监听端口3000
http.listen(3000);

7.(1)加载路由、处理路由、配置ejs模板、处理静态资源管理器

app.get app.post
app.set("view engine","ejs");
app.use(express.static('./public'));

(2)建立俩文件,index.ejs、chat.ejs,在chat.ejs下我们需要引入

<script src="/socket.io/socket.io.js"></script>
<script src="/jquery-1.12.4.js"></script>

如果你本地没有的话,你可以这样玩~~

咱可以引用在线的嘛(亲测好使)

<script src="http://code.jquery.com/jquery-latest.js"></script>

8.app.get 路由 action=‘check'

判断登陆的三个条件

1-不能为空

2-不能重名

3-注册并且跳转chat页面

9.咱登陆了,要聊天,咱得告诉别人咱叫啥啊!!!所以这里需要处理session了,并且在chat页面显示出来嘛

10.所以咱得开始建立websocket通讯了

client

<script src="/socket.io/socket.io.js"></script>
<script src="/jquery-1.12.4.js"></script>

<script>
   var socket=io();

   socke.emit('事件名','数据'); 数据可以是对象(登陆者和内容)
</script>

server

io.on('connection',function(socket){
  socket.on('事件名',function(data){

    io.emit('新的事件名',data);
  });
});

client

socket.on('新的事件名',function(msg){
     dom操作  把msg数据渲染给我们的dom结构
})

基本的思路和步骤就是这些

现在一切工作准备就绪,开始码代码

app.js

var express=require('express');
var app=express();
var http=require('http').Server(app);
var io=require('socket.io')(http);

var session=require('express-session');
app.use(session({
 secret: 'keyboard cat',
 resave: false,
 saveUninitialized: true,
 //cookie: { secure: true }
}));

//模板引擎
app.set("view engine","ejs");
//静态服务
app.use(express.static('./public'));

var alluser=[];
//中间件
//显示首页
app.get('/',function(req,res,next){
  res.render('index');
});

//确认登录,检查此人是否有用户名 昵称不能重复
app.get('/check',function(req,res,next){
  var yonghuming=req.query.yonghuming;

  if(!yonghuming){
    res.send('必须填写用户名');
    return;
  }

  if(alluser.indexOf(yonghuming) != -1){
    res.send('用户名重名');
    return;
  }

  alluser.push(yonghuming);

  console.log(alluser);

  req.session.yonghuming=yonghuming;
  res.redirect("/chat");
});

//聊天室
app.get('/chat',function(req,res,next){
  //console.log(req.session.yonghuming);
  //console.log(123);
  if(!req.session.yonghuming){
    res.redirect("/");
    return;
  }
  res.render('chat',{
    'yonghuming':req.session.yonghuming
  });
});

io.on('connection',function(socket){
  socket.on('liaotian',function(msg){
    console.log(msg);
    //io.emit('liaotian',msg);
    //console.log(io);
    io.emit('liaotian',msg);
  });
})

//监听端口
http.listen(3000);
console.log('server start port 3000');

index.ejs(放views文件夹下)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    div{
      width:700px;
      height:30px;
      padding:40px;
      border:1px solid #000;
      margin:0 auto;
    }
    #yonghuming{
      font-size:30px;
    }
  </style>
</head>
<body>
  <div>
    <form action="/check" method="get">
    输入昵称:
    <input type="text" id="yonghuming" name="yonghuming">
    <input type="submit" value="进入聊天室">
    </form>
  </div>
</body>
</html>

chat.ejs

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <title>Document</title>
  <style>
    .caozuo{
      position:fixed;
      bottom:0;
      left:0;
      height:100px;
      background-color:#eee;
      width:100%;
    }
    .caozuo input{
      font-size:30px;
    }
    .caozuo input[type=text]{
      width:100%;
    }
  </style>
</head>
<body>
  <h1>Edison聊天室<span id="yonghu"> 欢迎:<%=yonghuming %></span></h1>
  <div>
    <ul class="liebiao"></ul>
  </div>
  <div class="caozuo">
  <input type="text" id="neirong"/>
  <input type="button" id="fayan" value="发言"/>
  </div>

  <script src="/socket.io/socket.io.js"></script>
  <script src="/jquery-1.12.4.min.js"></script>
  <script>
    var socket=io();
    $('#neirong').keydown(function(e){
      if(e.keyCode==13){
            //回车发送消息
        socket.emit('liaotian',{
          'neirong':$('#neirong').val(),
          'ren':$('#yonghu').html(),
        });
        $(this).val('');
      }


    });

    /*
    $("#fayan").click(function(){
       //点击发言按钮发送消息
      socket.emit('liaotian',{
        'neirong':$('#neirong').val(),
        'ren':$('#yonghu').html(),
      });
    });*/

    socket.on('liaotian',function(msg){
      $(".liebiao").prepend("<li><b>"+msg.ren+": </b>"+msg.neirong+"</li>");
    });
  </script>
</body>
</html>

express框架实现基于Websocket建立的简易聊天室

聊天室登陆界面

express框架实现基于Websocket建立的简易聊天室

edison进入聊天室

express框架实现基于Websocket建立的简易聊天室

edison与chan聊天

在码代码过程中,不断的踩坑,填坑,第一次整这玩意,很多地方不熟悉,难免有些错误,毕竟学习过程嘛,有点磕碜,如果你们也写了好使了,咱可以共同进步一起美化,完善更多的功能,忘各位old铁见谅~~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype使用指南之array.js
Jan 10 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
js判断url是否有效的两种方法
Mar 04 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
使用JavaScript进行表单校验功能
Aug 01 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
Jan 22 Javascript
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
js实现鼠标点击页面弹出自定义文字效果
Dec 24 Javascript
bootstrap table服务端实现分页效果
Aug 10 #Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 #Javascript
React-Native做一个文本输入框组件的实现代码
Aug 10 #Javascript
js实现省市级联效果分享
Aug 10 #Javascript
JavaScript使用Ajax上传文件的示例代码
Aug 10 #Javascript
jquery对table做排序操作的实例演示
Aug 10 #jQuery
基于JavaScript实现飘落星星特效
Aug 10 #Javascript
You might like
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
python数据归一化及三种方法详解
2019/08/06 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
用python制作个音乐下载器
2021/01/30 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
电气自动化个人求职信范文
2014/02/03 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
2016年校长新年寄语
2015/08/17 职场文书
如何撰写促销方案?
2019/07/05 职场文书