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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python中join和split用法实例
2015/04/14 Python
python实现微信自动回复功能
2018/04/11 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
django自带调试服务器的使用详解
2019/08/29 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
德国团购网站:Groupon德国
2018/03/13 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
大学同学十年聚会感言
2014/02/21 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python