C#心跳机制服务器

控制台应用项目

Program.cs

internal class Program
{static Server server;static void Main(string[] args){Server server = new Server(IPAddress.Any,3333);server.Start();// 除了服务器监听方法,监听客户连接的方法,扫描客户端是否在线的方法//如果监听到有客户端连接的时候,打印哪个终端连入到服务器了 使用时间封装server.有客户端连入的事件 += 有客户端连入服务器方法;// 绑定事件server.客户端断开事件 += f2;server.接受到消息的事件 += f3;Console.ReadKey();}// 相当于点击之后的毁掉方法,在客户端连接成功之后调用这个方法public static void 有客户端连入服务器方法(object obj){TcpClient t1 = obj as TcpClient;Console.WriteLine(t1.Client.RemoteEndPoint+"连接到服务器");}public static void f2(object obj){Console.WriteLine(obj.ToString()+"断开连接");}public static void f3(TcpClient t1, byte[] b1){t1.GetStream().Write(b1, 0, b1.Length);}
}

Server.cs

internal class Server
{TcpListener listen;// 1 通过构造函数创建服务器对象public Server(IPAddress ip,int port){listen = new TcpListener(ip, port);}// 2 封装开启监听的方法public void Start(){listen.Start(100);// 开启监听// 接受客户端的连接StartConnect();// 扫描心跳方法SaoMiao();}// 3 接受客户端的连接 封装一监听客户端连接的方法// 保存所有的客户端字典,键是ip 值是客户端Dictionary<string, TcpClient> clientDic = new Dictionary<string, TcpClient>();// 字段保存客户端和当前连接服务器时间点Dictionary<string, DateTime> heartDic = new Dictionary<string, DateTime>();public event Action<TcpClient> 有客户端连入的事件;   void StartConnect(){Task.Run(() =>{while (true)// 接入多个客户端{TcpClient client = listen.AcceptTcpClient();string ip = client.Client.RemoteEndPoint.ToString();// 获取远程ip// 保存当前客户端clientDic.Add(ip, client);// 记录当前客户端心跳 链接成功的时候记录当前客户端时间点heartDic.Add(ip, DateTime.Now);// 调用事件函数 触发事件有客户端连入的事件?.Invoke(client);// 4接受客户端发来的消息ReceivMsg(client);}});}// 4 接受客户端发来的消息// 封装接受的消息public event Action<string> 客户端断开事件;// 当客户端断开时候调用public event Action<TcpClient, byte[]> 接受到消息的事件;// 接收到消息调用void ReceivMsg(TcpClient t1){NetworkStream stream = t1.GetStream();string ip = t1.Client.RemoteEndPoint.ToString();byte[] bs = new byte[1024];Task.Run(() =>{try{while (true){int count = stream.Read(bs, 0, bs.Length);// 必须判断是否是心跳包 事先约定好if (count == 0){// 客户端断开throw new Exception("客户端断开连接");}// 如果接收数据长度不为0// 必须判断是否心跳包 事先约定好:如果数据第一位是0的时候,当成普通包// 如果数据第一位是1说明是心跳包switch (bs[0]) // 判断第一位数据是不是0{case 0: // 普通数据 取出来的时候不需要显示第一位标识符// skip 从第一位开始截取// take 到指定位置的元素为止// 第一位0、1代表是否心跳包标识符// byte[] body = bs.Skip(1).Take(count-1).ToArray();// 要么群发 要么单发接受到消息的事件?.Invoke(t1,body);break;case 1: // 发的是心跳包// 修改是心跳包发的时间点heartDic[ip] = DateTime.Now;break;}}}catch (Exception e){// 从字典里把客户端清除掉clientDic.Remove(ip);// 如果客户端打开了,打印客户客户端断开事件?.Invoke(ip);//删除心跳记录heartDic.Remove(ip);}});}// 遍历所有客户端 扫描是否在未超时时间内void SaoMiao(){Task.Run(() =>{while (true){Thread.Sleep(4000);// 线程休眠4sDateTime now1 = DateTime.Now;foreach (var item in heartDic) // 遍历所以的心跳记录{// now1 当前时间点// item.Value 服务器接受客户端发来的心跳包时间if (now1-item.Value>new TimeSpan(0,0,4)){Console.WriteLine(item.Key+"掉线了");}else{Console.WriteLine(item.Key+"在线");}}}});}// 无参数的构造函数public Server(){}// 群发方法public void Send(){}// 指定给谁发public void send指定(){}//指定给哪些客户端发
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器上激活conda环境conda: error: argument COMMAND: invalid choice: ‘activate‘

正常我们使用如下来流程&#xff1a; 创建环境&#xff1a;conda create -n 环境名称 激活环境&#xff1a;conda activate 环境名称 但是&#xff0c;在Linux服务器上&#xff0c;使用conda activate 环境名称&#xff0c;出现如上图所示的报错。conda: error: argument CO…

2.1 嵌入式八股文(三)

一、C中类成员的访问权限&#xff1f; C通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。在类的内部&#xff08;定义类的代码内部&#xff09;&#xff0c…

Excel 常用技巧(六)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件&#xff0c;可以用来制作电子表格、完成许多复杂的数据运算&#xff0c;进行数据的分析和预测&#xff0c;并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

CMSIS-RTOS2简介

本文介绍CMSIS-RTOS2。 1.引入 CMSIS-RTOS2在基于Arm Cortex处理器的设备上运行的实时操作系统内核上指定了通用RTOS接口。应用程序和中间件组件可以使用CMSIS-RTOS2 API在各种软件生态系统中实现更好的代码重用和更简单的集成。 CMSIS-RTOS2还指定了RTOS内核使用的标准OS T…

windows上安装redis,并且用pycharm联通调用测试

在 Windows 上启动 Redis&#xff0c;官网版本不支持windows直接安装&#xff0c;你可以按照以下步骤进行操作&#xff1a; 使用Github Redis 版本启动 Redis 如果你想使用 Redis 在 Windows 上启动 Redis&#xff0c;以下是基本的步骤&#xff1a; 下载 Redis&#xff1a; 访…

回溯算法2(c++)

棋盘问题 题目描述 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 k个棋子的所有可…

自定义starter并发布maven私服

一、搭建nexus私服 nexus就是maven的私有服务器&#xff0c;这个搭建教程可以在网络上找到很多&#xff0c;这里就不赘述了。搭建完成之后再进行下一步 二、本地maven的setting配置文件中配置nexus的用户名和密码 <servers><server><id>nexus-releases<…

索引在手,查询无忧:MySQL索引简介

在数据库的世界里&#xff0c;MySQL作为一款广泛使用的关系型数据库管理系统。在DB-Engines的2024年5月的数据库管理系统流行度排名中得分1084&#xff0c;仅次于老大哥Oracle&#xff0c;足以MySQL在全球数据库市场中占有重要地位&#xff0c;当然MySQL在2009年被Oracle公司收…

解决使用Jmeter进行测试时出现“302“,‘‘401“等用户未登录的问题

使用 JMeter 压力测试时解决登录问题的两种方法 在使用 JMeter 进行压力测试时&#xff0c;可能会遇程序存在安全验证&#xff0c;必须登录后才能对里面的具体方法进行测试&#xff1a; 如果遇到登录问题&#xff0c;通常是因为 JMeter 无法模拟用户的登录状态&#xff0c;导…

表单中的常用元素

10.图像形式上传文件 <input type“image”>定义图像形式的提交。 src 属性和alt属性必须与<input type“image””>结合使用。 input type"image"src"img/l.jpg"alt"submit"/> 11.下拉列表框 <select>标签定义下拉列表框…

JS中splice怎么使用

在JavaScript中&#xff0c;splice() 是一个数组方法&#xff0c;用于添加/删除项目&#xff0c;并返回被删除的项目。这个方法会改变原始数组。 splice() 方法的基本语法如下&#xff1a; array.splice(start[, deleteCount[, item1[, item2[, ...]]]]) start&#xff08;必…

数据库管理-第205期 换个角度看23ai(20240617)

数据库管理205期 2024-06-17 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09;1 规范应用开发2 融合总结 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE Pro…

数据库修复实例2(副本出入口修复)

修复目标 修复Bfa-5人副本出入口&#xff08;Bfa 为 WOW 争霸艾泽拉斯版本&#xff09; SET OGUID : 7000316; SET ATID : 69; SET ATCP : 56; SET ATIDSPAWN : 70; SET SPAWNGROUP : 1251; SET WORLDSAFELOCID : 100042;-- Adjust GameObjects DELETE FROM gameobject WHERE…

c# 根据空格分割字符串

在C#中,可以使用以下方法根据多个空格来分割字符串: 使用 Split() 方法: string input " Hello World How are you? "; string[] words input.Split(new[] { }, StringSplitOptions.RemoveEmptyEntries);// words 数组包含: ["Hello", &qu…

Python导出mysql 表ORM模型

1、安装sqlacodegen pip install sqlacodegen pip install pymysql 2、导出指定数据表 单表 sqlacodegen mysqlpymysql://root:password127.0.0.1:3306/test --tables user --outfile user.py 多表 sqlacodegen mysqlpymysql://root:password127.0.0.1:3306/test --tabl…

大量用户中招,远控木马已经潜伏各类在线会议平台

从 2023 年 12 月开始&#xff0c;研究人员发现有攻击者创建虚假 Skype、Google Meet 和 Zoom 网站来进行恶意软件传播。攻击者为安卓用户投递 SpyNote 远控木马&#xff0c;为 Windows 用户投递 NjRAT 和 DCRAT 远控木马。 攻击行动概述 攻击者在单个 IP 地址上部署了所有的虚…

小白入手实现AI客服机器人demo

一、环境准备 1 安装python 2 安装vscode 3 安装相关python库 pip install flask flask_cors openai 4.在vscode里安装TONGYI Lingma(AI编程助手&#xff09; 二、后端搭建 创建一个后端文件夹chatbot&#xff0c;再新建一个app.py的python文件 from flask import Flask, requ…

electron下载失败(electron如何切换镜像源)

打开&#xff1a; 或者&#xff1a; C:\Users\用户名\.npmrc 添加&#xff1a; electron_mirrorhttps://npmmirror.com/mirrors/electron/ 到文件中&#xff0c;保存 方法二&#xff1a; npm config set ELECTRON_MIRROR https://npmmirror.com/mirrors/electron/ ELECTR…

【Python入门与进阶】Python文件与文件夹操作

在Python中&#xff0c;你可以使用os模块来进行文件和文件夹的操作。下面是一些常用的文件和文件夹操作示例&#xff1a; 文件操作 打开文件&#xff1a;使用open()函数打开文件。可以指定文件名、打开模式&#xff08;读取、写入、追加等&#xff09;&#xff0c;并返回一个…

AIOps在业务运维的最佳应用实践

随着企业IT基础架构的复杂性日益增加&#xff0c;传统运维模式难以满足高效、稳定的业务需求。AIOps&#xff08;人工智能运维&#xff09;作为一种新兴技术&#xff0c;通过数据驱动的自动化和智能化手段&#xff0c;有效提升了IT运维的效率和可靠性。本文将探讨AIOps在业务运…