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#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核