首页 > 其他分享 >express使用ws

express使用ws

时间:2024-04-23 10:33:06浏览次数:20  
标签:lastActiveTime clientObject express client ws key 使用 var

var express = require('express');
var expressWs = require('express-ws');
var app = express();
expressWs(app);

var PORT = 7777;
var clientObject = {};

app.ws('/', (client, req) => {
    var key = req.socket.remoteAddress + "_" + req.socket.remotePort;
    clientObject[key] = {
        cli: client,
        lastActiveTime: Date.now(), // 记录最后活跃时间
    };

    client.on('message', (message) => {
        client.send("收到你的消息了" + message);
        clientObject[key].lastActiveTime = Date.now(); // 更新最后活跃时间
    });

    client.on('close', (code, reason) => {
        console.log(`WebSocket close event code: ${code}, reason: ${reason}`);
        delete clientObject[key];
    });

    client.on('error', (err) => {
        console.error("WebSocket error observed:", err);
        delete clientObject[key];
    });
});

app.get('/', (req, res) => {
    res.send("hello 2023");
});

// 封装心跳逻辑
function setupHeartbeat() {
    setInterval(() => {
        var time = Date.now();
        for (var key in clientObject) {
            var client = clientObject[key].cli;
            var lastActiveTime = clientObject[key].lastActiveTime;
            
            // 检查最后一次活跃时间是否超过了1分钟(60000毫秒)
            if (time - lastActiveTime > 60000) {
                console.log('Client timed out due to inactivity:', key);
                delete clientObject[key];
                continue;
            }

            try {
                var sData = {
                    rspdata: {
                        heartBeat: time,
                        time: time,
                    },
                };
                client.send(JSON.stringify(sData));
            } catch (e) {
                console.error("Heartbeat error:", e);
                // 如果发送心跳失败,也关闭连接
                client.close();
                delete clientObject[key];
            }
        }
    }, 3000); // 每3秒发送一次心跳
}

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
    setupHeartbeat(); // 设置心跳检测
});

标签:lastActiveTime,clientObject,express,client,ws,key,使用,var
From: https://www.cnblogs.com/qcy-blog/p/18152295

相关文章

  • Nexpose v6.6.247 for Linux & Windows - 漏洞扫描
    Nexposev6.6.247forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseApr17,2024请访问原文链接:Nexposev6.6.247forLinux&Windows-漏洞扫描,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时......
  • Metasploit Pro 4.22.3-2024041701 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.3-2024041701(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,ReleaseApr17,2024请访问原文链接:MetasploitPro4.22.3-2024041701(Linux,Windows)-专业渗透测试框架,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世......
  • Invicti v24.4.0 for Windows - Web 应用程序安全测试
    Invictiv24.4.0forWindows-Web应用程序安全测试InvictiStandard17Apr2024v24.4.0请访问原文链接:Invictiv24.4.0forWindows-Web应用程序安全测试,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgInvicti是一种自动化但完全可配置的Web应用程序安全......
  • 使用Docker搭建MongoDB 5.0版本副本集集群
    1、mongodb集群首先我们需要了解mongodb的集群模式,mongodb安装分为单机安装和集群安装。集群安装分为:主从复制(Master-Slaver)集群、副本集(ReplicaSet)集群和分片集群(ShardedCluster)。MongoDB的主从复制(Master-SlaveReplication)已不再是官方推荐的特性,并且在未来的版本中可能会被......
  • 界面组件DevExpress Blazor UI v23.2 - 支持.NET 8、全新的项目模版
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v23.2版本了,新版本正式支持.NET8、拥......
  • Map使用对象作key
    Map介绍:Map是一个集合,一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以是任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value);Map的key和value都是泛型的,所以Map的key和value可以任意类型的使用对象做Map的key......
  • keycloak~使用jwks验证token的合法性
    keycloak提供了jwks服务,其地址可以在/auth/realms/fabao/.well-known/openid-configuration的返回结果中找到,jwks_uri它表示了公钥的颁发者,可以使用颁发出来的公钥来验证token的签名,基地址也是固定的/auth/realms/fabao/protocol/openid-connect/certs。springboot构建keycloak的......
  • [986] Filter rows by containing a particular word in Pandas
    In Pandas,youcanfilterrowsbasedonwhetheraspecificcolumncontainsaparticularwordorsubstring.Hereareafewwaystoachievethis:Using str.contains():Tofilterrowswhereaspecificcolumn(let’ssay‘ids’)containstheword“ball,”......
  • Fail to create wsdl definition
    D:\Software\WebService\apache-cxf-3.3.1\bin>wsdl2java-encodingutf-8http://XXX.XXX.XXX.XXX:10051/NIS_SZLonghuaFY/EwellInterfaceService?wsdlWSDLToJavaError:org.apache.cxf.wsdl11.WSDLRuntimeException:Failtocreatewsdldefinitionhttp://XXX.X......
  • 使用 C# 的 gRPC 服务
    本文内容proto文件将.proto文件添加到C#应用对.proto文件的C#工具支持生成的C#资产其他资源本文档概述在C#中编写 gRPC 应用所需的概念。此处涵盖的主题适用于基于 C-core 和基于ASP.NETCore的gRPC应用。proto文件gRPC使用协定优先方法进行......