NodeJS实现一个聊天室功能


Posted in NodeJs onNovember 25, 2019

看效果

一直说我喜欢卖关子,这次直接看效果:

NodeJS实现一个聊天室功能

聊天界面(喜欢的可以自己画一个比较逼真的页面)

NodeJS实现一个聊天室功能

前文

先说一下为什么写这个东西,最近不是在写NodeJS知识点的梳理嘛,但是我发现梳理的过程着实无聊的要死,虽然已经快梳理一半了,只是还没发布,这个不重要,重要的是不做点什么东西确实无聊,所以今天把我做这个的过程记录给你们看一下,喜欢的可以拿去玩玩。实现的功能是可以聊天,可以显示用户自定义的昵称,并且显示发送时间

PS:这个功能如果我们使用webstorm新建一个express app的项目的话,是可以省很多代码的,但是这里我们选择原生实现它,原因是我们写代码不可能一直依赖于别人搭建好的框架或者轮子,虽然我们提倡不重复造轮子,但是如果每一个程序员都这样想的话,这个行业面临的将是一个轮子都没有。

客户端代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>http_demo</title>
  <script src="/socket.io/socket.io.js"></script>
</head>
<body>
  <h1>
    WelCome to CSDN of clearlove
  </h1>
  <p>
    If you like my article, you can follow my blog
  </p>
  <p>公屏聊天</p>
  <div id="infos">
  </div>
  <input style="margin-top: 5vh;
  width: 100px;
  height: 40px;
  border: 1px solid #ffffff;
  border-radius: 4px;
  color: #000000;
  padding-left: 10px" type="text" id="nick" value="" placeholder="昵称" />
  <input type="text" id="send_info" value="" placeholder="请输入您想说的话" />
  <button type="button" id="btn">发送</button>
</body>
<script>
  //创建一个io对象
  var socket = io();
  //用户点击发送的时候直接将昵称和信息内容发送过去,如果没有昵称,显示匿名,判断是不是有值
  document.getElementById("btn").onclick = function () {
    if(document.getElementById("send_info").value){
      socket.emit("link_to_server", document.getElementById("send_info").value, document.getElementById("nick").value ? document.getElementById("nick").value : '匿名')
    }else{
      alert(`发送内容不可以为空`)
    }
  }
  // 收到的信息展示出来,新建一个元素,append到div中
  socket.on('link_to_client', function (msg) {
    var h6 = document.createElement('h6');
    h6.innerText = `${msg}`;
    document.getElementById('infos').append(h6)
  })
</script>
<style>
  body {
    background: #307ac6;
    text-align: center;
    color: aliceblue;
    margin: 0% 10%
  }
  p {
    font-size: 2rem
  }
  input {
    margin-top: 5vh;
    width: 200px;
    height: 40px;
    border: 1px solid #ffffff;
    border-radius: 4px;
    color: #000000;
    padding-left: 10px;
  }
  button {
    border: none;
    background: #ffffff;
    border-radius: 4px;
    width: 90px;
    height: 42px;
    color: #000000;
  }
  #infos {
    margin-left: 25vw;
    width: 400px;
    height: 500px;
    overflow: scroll;
    border: none;
    background: #ffffff;
    color: #000000;
  }
</style>
</html>

服务端代码

/**
 * @author clearlove
 * @aim 测试连接一个socket.io通信 广播
 */
//引入fs
var fs = require('fs')
//引入http 
var http = require('http')
var date = new Date()
/**
 * @FormDate 格式化时间
 * @param {*} date 当前时间
 */
function FormDate(date) {
  return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}`
}
/**
 * 搭建一个服务器
 */
var server = http.createServer(function (res, res) {
  if (res.url !== '/favicon.ico') {
    res.writeHead(200, { "Content-type": "text/html" })
    const myreadstream = fs.createReadStream(__dirname + '/views/http_demo.html', 'utf-8')
    myreadstream.pipe(res)
  }
})
//引入socket.io 这里是两步,第一步是io = require('socket.io') 第二步是一个新的变量.server 合成一步就是下面的代码
var io = require('socket.io')(server);
io.on("connection", function (socket) {
  //这里获取到对方的ip地址,可以展示,也可以不展示,也可以进行ip的过滤
  var clientIp = socket.request.connection.remoteAddress
  console.info("一个socket连接成功了")
  socket.on("link_to_server", function (msg, nick) {
    //这里使用io发送 
    io.emit('link_to_client', `${nick} : ${msg} ${FormDate(date)}`)
  })
})
server.listen(5000, '0.0.0.0');
console.info("server is running...")

服务跑起来

隐藏一下ip吧,为了安全

NodeJS实现一个聊天室功能

当然上面我用的一些可能比较‘原生',直接创建元素什么的,我是因为没有引入类似jquery这样的框架进来,引入的话就比较简单的,但是不影响我们实现这个基础的聊天功能,上面可能有一些你们不明白的地方或者是你们都明白,包括为什么上面启动的时候不是node+文件名字而是nodemon+文件名,有什么区别,有什么好处,都没关系,后面的文章我都会介绍上面用到的所有的知识点,具体怎么使用的,怎么出来的, 为什么这么写,怎么一步一步实现目前的这个效果,后面的文章我都会更新,为什么这个时候写这个呢?原因是我想让更多的人知道NodeJS本身是一个很好玩的语言,可以做的事情很多。如果你们看了我的文章以后喜欢上了NodeJS我的目的就达到了,毕竟我还是觉得NodeJS是一个非常强大的语言,我希望更多的人使用它。

如果有人觉得不想看那么多就想玩玩这个效果的,也可以,直接安装node、然后本地初始化一个package.json,然后安装nodemon、socket.io就可以了,具体怎么安装,emmmmm

安装node

下载node

下一步下一步就好了

初始化package.js

npm init

输入名字 版本号之后 一直回车就好了

安装nodemon

npm install -g nodemon --save-dev

安装socket.io

npm install socket.io --save-dev

总结

以上所述是小编给大家介绍的NodeJS实现一个聊天室功能,点击跳转按钮实现跳转,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

NodeJs 相关文章推荐
nodejs实现黑名单中间件设计
Jun 17 NodeJs
提高NodeJS中SSL服务的性能
Jul 15 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 #NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 #NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 #NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 #NodeJs
nodejs实现UDP组播示例方法
Nov 04 #NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 #NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 #NodeJs
You might like
PHP开发大型项目的一点经验
2006/10/09 PHP
用session做客户验证时的注意事项
2006/10/09 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
php下Memcached入门实例解析
2015/01/05 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP Cookie学习笔记
2016/08/23 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
js数据类型检测总结
2018/08/05 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
Python 中Pickle库的使用详解
2018/02/24 Python
NumPy 数组使用大全
2019/04/25 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Python中的流程控制详解
2021/02/18 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
后勤部经理岗位职责
2014/02/23 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
园艺师求职信
2014/03/10 职场文书
继承权公证书
2014/04/09 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书