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#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回