HTML+CSS+JS+node.js实现websocket聊天室

2023-11-05

本文实现如题所说,使用的websocket库是nodejs-websocket库,可在网上直接下载安装:npm install nodejs-websocket     使用是直接在文件中require即可

一开始想用PHP写后台实现服务器端websocket,但是PHP没有实现,所以又选择了node.js,这是第一个简单版本,具体代码如下,代码中有注释,后期会添加一些文字形式的注释和实现过程中遇到的问题

HTML网页:

<!doctype html>
<html>
    <head>
        <meta charset='utf-8'>
        <link rel='stylesheet' href='http://10.138.244.142/websocket/client.css'>
    </head>
    <body>
        <div class='userLogin'>
            <p id='userLoginHint'>请输入用户名:</p>
            <input type='text' id='userName'>
            <button id='userNameButtonEnter'>注册</button>
        </div>
        <hr>
        <div id='historyMessage'>
        </div>

        <textarea id='inputText'></textarea>
        <button id='send' disabled='true'>发送</button>

        <div id='systemStatus'>
            <p id='connectStatue'>正在连接...</p>
           <!-- <p id='numberOnline'>当前在线人数:3</p>
            <p id='yourselfName'>用户名:</p-->
        </div>
        <p id='receMessage'></p>
        <script src='http://10.138.244.142/websocket/client.js'></script>
    </body>
</html>
CSS代码:
.userLogin{
    text-align: center;
}
#userLoginHint{
    display: inline;
}
#historyMessage{
    height:400px;
    background-color: #DBD8D8;
    overflow: auto;
    padding: 2px;
}

#inputText{
    width:85%;
    height:90px;
}

#systemStatus{
    text-align: center;
}

#systemStatus>p{  
    display: inline-block;
    padding-right: 150px;
}
效果如下:
前台代码js脚本:
//---------------读HTML页面中的句柄------------------------------------------//
var loginButton=document.getElementById('userNameButtonEnter');
var userName=document.getElementById('userName');
var inputText=document.getElementById('inputText');//读输入框的句柄
var dispStatus=document.getElementById('dispStatus');//读按钮的句柄
var receMessage=document.getElementById('receMessage');//读显示的句柄
var loginButton=document.getElementById('userNameButtonEnter');//读注册按钮
var userName=document.getElementById('userName');//读输入框
var divhistoryMessage=document.getElementById('historyMessage');//历史消息框
var connectStatue=document.getElementById('connectStatue');
//var numberOnline=document.getElementById('numberOnline');
//var yourselfName=document.getElementById('yourselfName')
var sendButton=document.getElementById('send');
//------------------------------------------------------------------------//

//============定义变量================//
//var user=userName.value;
var userNameArray=new Array();//用于存放用户名
var x;//遍历是否存在重复用户名时的循环变量
var ws=new WebSocket('ws://10.138.244.142:8000');//创建websocket连接,,服务端的IP+端口号
//========================================//

/***********注册事件********************************** */
//注册按钮点击事件,若输入框(用户名)内容为空,则提示重新输入,若内容不为空,点击注册按钮之后按钮和输入框禁用,一次来表示一个用户只能注册一次
login:
loginButton.addEventListener('click',function(){
    if(userName.value==''){
        alert('用户名不能为空,请重新输入');
    }
    else{
         if(userNameArray.length==0){             //先判断用户名是否为空,若为空报错,重新输入
             userNameArray.push(userName.value);         //不为空继续执行,判断用户数组是否为空,若为空,直接把用户名压入
         }                                     //若用户数组中有用户,则进行遍历扫描,查看当前注册用户与之前的用户是否右有重复
         else{                                 //若有重复,报错并清空输入
            for(x in userNameArray){          //若遍历之后没有重复,退出for循环,将此用户名压入用户名数组最后一个
                if(userName.value==userNameArray[x]){
                    alert('重复注册');
                    userName.value='';
                    //break login;//如果遇到重复的就直接跳出,跳到用户注册开始的地方,等待下一次注册
                }
            }
            userNameArray.push(userName.value);
        }
        
        ws.send('userID:'+userNameArray[userNameArray.length-1]);//向服务器发送最后一个注册的用户
        loginButton.disabled=true;//注册按钮禁止使用
        userName.disabled=true;//用户名禁止输入
        sendButton.disabled=false;//使能发送按钮
        connectStatue.innerHTML='连接成功<br>';
    }
})
/**************************************************** */

//!!!!!!!!!!!!函数!!!!!!!!!!!!!!!!!!!!!!!!!!!//
alert('先注册用户名');

ws.onopen=function(e){//开始创建连接时的事件,显示连接成功
    
}

sendButton.οnclick=function(e){//按钮按下触发事件,
    ws.send(inputText.value,true);//按下按钮向服务端发送输入框中的值
    inputText.value='';
}

ws.onmessage=function(e){//读取服务端接收到的信息
    var time=new Date();
    var receiveString=e.data;//将接收到的数据变成字符串保存到变量中
    var index_userID=receiveString.indexOf('userID');
    var receUserName=receiveString.slice(0,index_userID);
    divhistoryMessage.innerHTML += receUserName+time.getHours()+':'+time.getMinutes()+':'+time.getSeconds()+'>>>'+receiveString.slice(index_userID+6)+'<br>';//将信息显示出来
    //yourselfName.innerHTML +=receiveString+'.....'+receUserName;
    divhistoryMessage.scrollTop=divhistoryMessage.scrollHeight;
}


后台node.js代码:
var ws=require("nodejs-websocket");//引入websocket模块
var msg=null;
var x=0;//遍历用户名数组的循环变量
var username='';//用来存放解析出来的用户名
var userNameObject={};//创建一个存储用户名的数组,key:userID  value:connect(每个连接的connect是不同的,但是我不会解析)
console.log("开始建立连接...");//后台打印状态信息
var server=ws.createServer(function(connect){//创建一个新连接
    connect.on("text",function(msg){//接收触发事件
        console.log("收到的消息是:"+msg);//接收到新消息之后在后台打印出来
        if(msg){//如果消息不是空,将接收到的消息发送给客户端
            if(msg.slice(0,7)=='userID:'){//解析收到的数据,若前几个为userID,则说明收到的是用户名,然后创建用户名数组
                username=msg.slice(7);
                userNameObject[username]=connect;//将连接信息赋给数组对象,键:解析出来的用户名,值就是连接
                server.connections.forEach(function (conn) {//广播
                    conn.sendText('System'+'userID'+'欢迎'+username+'加入');
                })
            }
            else{
                for(x in userNameObject){
                    if(connect==userNameObject[x]){//如果找到了对应的连接,那x键就是我们要用的userID
                        server.connections.forEach(function (conn) {//广播
                            conn.sendText(x+'userID'+msg);
                        })
                    }
                }
            }
        }
    });

}).listen(8000)

使用时需要改HTML中的CSS文件和前台脚本文件路径,还要改前台js脚本文件中的IP地址(改成本机地址就行了)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML+CSS+JS+node.js实现websocket聊天室 的相关文章

  • 为什么“事件”在 Chrome 中全局可用,而在 Firefox 中则不然?

    在回答另一个问题时 出现了一个与event对象在匿名函数中可用 无需传入 在 Chrome 中 下面的代码工作正常 但 Firefox 会抛出错误 document ready function uspsSideboxTrackingClo
  • Google Charts(AreaChart)如何检测缩放变化

    我正在画一个面积图 在覆盖层上有一些标记 我正在使用explorer选项 仅限水平 以便用户放大和缩小 问题是我找不到一种方法来通知缩放更改 以便有机会更新制造商位置 有一个图表范围变化事件 但它不是由 AreaChart 触发的 我尝试检
  • javascript 和 PHP 中的正则表达式有什么区别吗?

    这是在 javascript 中验证电子邮件地址的正则表达式 我不确定是否可以直接在 PHP 中使用它 a z d u00A0 uD7FF uF900 uFDCF uFDF0 uFFEF a z d u00A0 uD7FF uF900 uF
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • jQuery 验证日期范围问题

    我的代码中有很多地方有成对的相关开始和结束日期字段 范围 我需要验证开始日期早于结束日期 我正在使用 jQuery 验证插件 这是我的代码 http jsfiddle net jinglesthula dESz2 http jsfiddle
  • React/Redux bundle.js 太大

    我有一个小型的 React 项目 Webpack生成的bundle js大小为6 3Mb 如何将大小减小到 github webpack config js module exports devtool inline source map
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • 光滑的旋转木马不工作

    我一直在尝试简单地实现 Slick Carousel 的工作 我已按照 Git 页面上的说明进行操作 https github com kenwheeler slick https github com kenwheeler slick 这
  • 在 JavaScript 中定位提示弹出窗口

    我有一个如下所示的 JavaScript 提示 我想将提示放在屏幕中心 如何使用 javascript 做到这一点 function showUpdate var x var name prompt Please enter your na
  • 如何在一段特定时间后在后台运行 ajax 调用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在一段特定的时间后显示警报消息 您想继续吗 如果用户同意 则 ajax 调用必须在后台运行 否则取消 ajax 调用 那么请告诉我
  • 使用 IP 地址连接到另一台计算机

    我在计算机上安装了 NodeJS 并运行了一些测试 一切正常my机器 现在我想要一个不在同一网络中的朋友连接到我的计算机 以便 NodeJS 可以响应我朋友的请求 但我不知道 我必须在哪个IP和端口上监听 我也不知道 我必须给我的朋友哪个I
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 在 HTML5 中将两个图像合并到一个画布上

    我正在使用 HTML5 canvas 元素 假设我有 2 个 ImageData 对象 我想将它们组合起来放在一张画布上 假设我不关心这些图像如何组合 两个 ImageData 对象具有完全相同的像素数和形状 组合两个图像的最佳方式是什么
  • 从相机视图中拖动锁定在一定距离/半径处的对象

    我在场景中心有一个相机 距离相机 z 400 处有 1 个球体 其父级位于中心 我想从视图中向上 向下 向左 向右拖动球体 但同时不改变它相对于中心的 z 位置 我最终使用了另一个球体并使其不可见 添加side THREE DoubleSi
  • HTML 和 JavaScript - 将滚动操作从一个元素传递到另一个元素

    假设我有两个 div div div div A scrollable list div 我想让它当光标停在里面时 control并且鼠标滚轮滚动 view将会滚动 无论如何要实现这一目标 好的 快速修复对我有用 即使固定 div 不可滚动
  • ReferenceError 和全局对象

    在浏览器中的 JavaScript 中window是全局对象 这意味着在全局范围内定义的每个变量都是window 那么为什么我会得到这个结果 console log window foo No error logs undefined co
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • 在 JSP 或 Javascript 中清除浏览器缓存中的图像

    我正在为一所大学开发JSP Web 应用程序 用户页面中显示人员图片 用户注销后如何从网络浏览器缓存中清除这张图片 使用 JSP 或 JavaScript 那是不可能的 最好的选择是完全禁用相关资源的缓存 创建一个filter https
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要

随机推荐

  • 逻辑斯蒂(logistic)回归深入理解、阐述与实现

    第一节中说了 logistic 回归和线性回归的区别是 线性回归是根据样本X各个维度的Xi的线性叠加 线性叠加的权重系数wi就是模型的参数 来得到预测值的Y 然后最小化所有的样本预测值Y与真实值y 的误差来求得模型参数 我们看到这里的模型的
  • Docker run最后加/bin/bash遇到的问题

    问题展示 1 使用docker run dit 容器ID 容器名 一些参数 bin bash 后台启动es镜像 root iZ2zegnzd0af38r6v96pcfZ test docker run dit p 9200 9200 p 9
  • 【论文笔记】Ada3D: Exploiting the Spatial Redundancy with Adaptive Inference for Efficient 3D Object Detec

    Ada3D Exploiting the Spatial Redundancy with Adaptive Inference for Efficient 3D Object Detection 原文链接 https arxiv org a
  • 无视杀软登录远程服务器GoToHTTP

    在渗透测试中 我们会遇到服务器装有杀软导致提权木马上传不成功的问题 这里给各位师傅另外提供一种思路 使用GoToHTTP进行连接 被控文件下载地址GotoHTTP Free Download 将被控文件传入主机 执行命令启动被控文件 got
  • xshell5下载和安装教程

    1 xshell5的下载 首先到xshell的官网去下载 这里附上下载地址xshell5官网下载 点击链接进入官网后 下一步点击页面上的的Download 下载 按钮 然后点击页面上的下载图标进行下载 然后选择Evaluation user
  • numpy中的 numpy.c_ numpy.ravel numpy.mgrid的理解

    这三个函数一般用于绘制网格坐标点 自己在学习的时候也遇到了疑惑 现在做一个笔记整理一下 1 numpy中的mgrid 首先看一个例子 x y np mgrid 3 3 1 3 3 1 这里我要生成一个从 3到2的矩阵步长为1 结果为 3 2
  • kubernetes的使用五--安装heapster

    本文是kubernetes的使用的第五篇 我们安装heapster heapser是kubernetes体系的监控插件 能够使dashboard更加漂亮 如下图所示 在github下载heapster代码 代码地址https github
  • qtCreator安装make时报错cpuid.h没有那个文件或目录

    安装完qt之后 编译安装qtcreator 此时报错了 错误界面如下 不要慌 看到这个界面就稳了 因为这个问题已经被我成功解决 首先去下面这个网址下载源码叫60cc910的一个文件 https codereview qt project o
  • Blazor入门——第一个入门程序

    Blazor 是一个使用 NET 生成交互式客户端 Web UI 的框架 使用 C 代替 JavaScript 来创建丰富的交互式 UI 共享使用 NET 编写的服务器端和客户端应用逻辑 将 UI 呈现为 HTML 和 CSS 以支持众多浏
  • Dr. Memory检测内存泄露

    1 软件测试说明 vs2013里面可以很好的检测出来 vs2015的工程检测的不是很准 2 对win10系统的版本有要求 有些比较新的系统无法使用 3 Debug或者Release都行 包括win32和x64 4 使用 方法1 1 控制台里
  • MkDocs的使用-流程图、序列图

    标准Markdown语法并不支持流程图 序列图的绘制 好在MkDocs能够通过第三方插件pymdown extensions扩展来实现 在前篇中已经完成了pymdown extensions的安装 现在可以使用superfences来实现流
  • Android SHA加密实现

    同前篇博文的MD5加密 只要把加密文本转换为String就好了 package com tencent utils import java security MessageDigest import java security NoSuch
  • Numpy攻略系列:高级索引机制

    Numpy攻略系列 高级索引机制 所谓高级索引就是不使用整数或者切片作为索引值 在这一节重点介绍三类高级索引 常规的高级索引 位置列表型高级索引 布尔型高级索引的一类 常规的高级索引 给定一个矩阵 我们要求相关位置设置为特殊值 这里我们就假
  • C语言实现链表创建

    C语言实现链表的创建 链表 是一种物理存储单元上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点链表中每一个元素称为结点 组成 结点可以在运行时动态生成 每个结点包括两个部分 一个是存储数据元素
  • docker 部署springboot项目

    1 CentOS环境下需要安装docker jdk maven docker安装好后 需要修改一下镜像源地址 vi etc docker daemon json 添加如下 registry mirrors https registry do
  • input autocomplete="off"属性的作用

    有过表单设计经验的朋友肯定知道 当我们在浏览器中输入表单信息的时候 往往input文本输入框会记录下之前提交表单的信息 以后每次只要双击 input文本输入框就会出现之前输入的文本 这样有时会觉得比较方便 但有时也会暴露用户的隐藏数据 那么
  • 解决[Vue warn]: Invalid prop: type check failed for prop “index“.问题

    Vue warn Invalid prop type check failed for prop index Expected String got Undefined Vue 警告 属性无效 属性 索引 的类型检查失败 预期字符串 未定义
  • tcp参数详解之tcp_fin_timeout

    tcp fin timeout INTEGER 默认值是 60 对于本端断开的socket连接 TCP保持在FIN WAIT 2状态的时间 对方可能会断开连接或一直不结束连接或不可预料的进程死亡 默认值为 60 秒 过去在2 2版本的内核中
  • 【Java-----IO流(一)之字节流详解】

    IO流概述和分类 IO流概述 IO 输入 输出 Input Output 流 是一种抽象概念 对数据传输的总称 也就是说数据在设备间的传输成为流 流的本质是数据传输 IO流 用来处理设备间数据传输问题的 常见的应用如 文件复制 文件上传 文
  • HTML+CSS+JS+node.js实现websocket聊天室

    本文实现如题所说 使用的websocket库是nodejs websocket库 可在网上直接下载安装 npm install nodejs websocket 使用是直接在文件中require即可 一开始想用PHP写后台实现服务器端web