使用node.js如何简单快速的搭建一个websocket聊天应用

简介: 使用node.js如何简单快速的搭建一个websocket聊天应用

初始化项目


npm init


安装nodejs-websocket


npm install nodejs-websocket


创建并编辑启动文件


创建一个名为app.js文件,并且编辑它。


var ws = require("nodejs-websocket");
console.log("开始建立连接...")
var [user1,user2,user1Ready,user2Ready] = [null,null,false,false];
ws.createServer(function(conn){
    conn.on("text", function (str) {
        console.log("收到的信息为:"+str)
        if(str==="user1"){
            user1 = conn;
            user1Ready = true;
        }
        if(str==="user2"){
            user2 = conn;
            user2Ready = true;
        }
        if(user2Ready){
            user2.sendText(str);
        } 
        if(user1Ready){
          user1.sendText(str);
        }
    })
    conn.on("close", function (code, reason) {
        console.log("关闭连接")
    });
    conn.on("error", function (code, reason) {
        console.log("异常关闭")
    });
}).listen(8001)
console.log("WebSocket建立完毕")


分别创建并编辑两个用户页面文件


分别创建user1.htmluser2.html, 并且编辑它们。


user1.html


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user1</title>
    <style>
        #mes{
            width: 300px;
            height: 300px;
            border: 1px solid #666;
            overflow: auto;
            margin-bottom:10px;
            padding: 5px;
        }
        li{
            text-decoration: none;
            background: #f4f4f4;
            padding: 5px;
            margin-top: 5px;
        }
        .tl{
            color: red;
            text-align: left;
        }
        .tr{
            color: green;
            text-align: right;
        }
    </style>
</head>
<body>
    <ul id="mes"></ul>
    <div class="kuang">
        <input type="text" value="" class="int">
        <button class="send">发送</button>
    </div>
    <script>
        var mes = document.getElementById("mes");
        if(window.WebSocket){
            var ws = new WebSocket('ws://localhost:8001');
            ws.onopen = function(e){
                console.log("连接服务器成功");
                ws.send("user1");
            }
            ws.onmessage = function(e){
                if(e.data!=="user1"&&e.data!=="user2"){
                    console.log(e);
                    var newData = JSON.parse(e.data);
                    var node=document.createElement("LI");
                    var textnode=document.createTextNode(newData.mes);
                    node.appendChild(textnode);
                    if(newData.name==="user2"){
                        node.classList.add("tl")
                        mes.appendChild(node);
                    } else{
                        node.classList.add("tr")
                        mes.appendChild(node);
                    }
                }
                document.querySelector(".send").onclick = function(e){
                    var obj = {
                        name:"user1",
                        mes:document.querySelector(".int").value
                    }
                    ws.send(JSON.stringify(obj));
                    document.querySelector(".int").value="";
                }
            }
            ws.onclose = function(e){
                console.log("服务器关闭");
            }
            ws.onerror = function(){
                console.log("连接出错");
            }
        }
    </script>
</body>
</html>


user2.html


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user2</title>
    <style>
        #mes{
            width: 300px;
            height: 300px;
            border: 1px solid #666;
            overflow: auto;
            margin-bottom:10px;
            padding: 5px;
        }
        li{
            text-decoration: none;
            background: #f4f4f4;
            padding: 5px;
            margin-top: 5px;
        }
        .tl{
            color: red;
            text-align: left;
        }
        .tr{
            color: green;
            text-align: right;
        }
    </style>
</head>
<body>
    <ul id="mes"></ul>
    <div class="kuang">
      <input type="text" value="" class="int">
      <button class="send">发送</button>
  </div>
    <script>
        var mes = document.getElementById("mes");
        if(window.WebSocket){
            var ws = new WebSocket('ws://localhost:8001');
            ws.onopen = function(e){
                console.log("连接服务器成功");
                ws.send("user2");
            }
            ws.onmessage = function(e){
                if(e.data!=="user1"&&e.data!=="user2"){
                    console.log(e);
                    var newData = JSON.parse(e.data);
                    var node=document.createElement("LI");
                    var textnode=document.createTextNode(newData.mes);
                    node.appendChild(textnode);
                    if(newData.name==="user1"){
                        node.classList.add("tl")
                        mes.appendChild(node);
                    } else{
                        node.classList.add("tr")
                        mes.appendChild(node);
                    }
                }
                document.querySelector(".send").onclick = function(e){
                    var obj = {
                        name:"user2",
                        mes:document.querySelector(".int").value
                    }
                    ws.send(JSON.stringify(obj));
                    document.querySelector(".int").value="";
                }
            }
            ws.onclose = function(e){
                console.log("服务器关闭");
            }
            ws.onerror = function(){
                console.log("连接出错");
            }
        }
    </script>
</body>
</html>


启动项目


node app.js



相关文章
|
2月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
195 77
|
6天前
|
敏捷开发 人工智能 JavaScript
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
Figma-Low-Code 是一个开源项目,能够直接将 Figma 设计转换为 Vue.js 应用程序,减少设计师与开发者之间的交接时间,支持低代码渲染和数据绑定。
27 3
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
|
2天前
|
数据挖掘 UED
WebSocket在实时体育比分网站中的应用
WebSocket 在实时体育比分网站中用于实时比分更新、动态赛事信息推送、交互式功能(如即时聊天和投票)、赛程提醒与推送通知、比分预测与数据分析,以及多平台支持。通过持久连接,服务器可即时推送比分变化、球员动态、比赛状态等信息,减少延迟并提升用户体验。同时,WebSocket 支持双向通信,使用户能实时互动,确保跨平台的实时数据同步。
|
1天前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
19 8
|
2月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
79 31
|
1月前
|
网络协议 应用服务中间件 网络安全
odoo17在线聊天报错提示 Couldn‘t bind the websocket...
当 Odoo 17 报错 "Couldn't bind the websocket..." 时,通过检查和配置 WebSocket 端口、防火墙规则、代理服务器以及 Odoo 配置文件,可以有效解决此问题。确保每一步操作准确无误,最终重启相关服务,使配置生效。希望这些步骤能帮助您快速恢复 Odoo 的在线聊天功能。
48 1
|
2月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
2月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
55 3
|
6月前
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
3月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
744 1