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#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程