C#心跳机制服务器

2024-06-18 04:52

本文主要是介绍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指定(){}//指定给哪些客户端发
}

这篇关于C#心跳机制服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071351

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片