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 相关文章推荐
超清晰的document对象详解
Feb 27 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
键盘KeyCode值列表汇总
Nov 26 Javascript
使用window.prompt()实现弹出用户输入的对话框
Apr 13 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
Javascript下拉刷新的简单实现
Feb 14 Javascript
详解在Vue中通过自定义指令获取dom元素
Mar 04 Javascript
JS实现根据密码长度显示安全条功能
Mar 08 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
vue弹窗组件的实现示例代码
Sep 10 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 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 Class 文章
2007/04/04 PHP
php intval的测试代码发现问题
2008/07/27 PHP
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
会计试用期自我评价
2014/09/19 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书