diff --git a/CommonLibrary/Common.cs b/CommonLibrary/Common.cs index 20b6ae9..09ed9ea 100644 --- a/CommonLibrary/Common.cs +++ b/CommonLibrary/Common.cs @@ -12,7 +12,7 @@ namespace CommonLibrary { //初始化模版的版本号 //预计第一个正式发行的版本为1.1.0 日期为2017-08-10 - SoftBasic.FrameworkVersion = new SystemVersion("1.0.5"); + SoftBasic.FrameworkVersion = new SystemVersion("1.0.6"); } diff --git a/CommonLibrary/CommonLibrary.csproj b/CommonLibrary/CommonLibrary.csproj index eccbdfb..b3cbbc2 100644 --- a/CommonLibrary/CommonLibrary.csproj +++ b/CommonLibrary/CommonLibrary.csproj @@ -30,7 +30,7 @@ 4 - + False ..\Public\HslCommunication.dll diff --git a/CommonLibrary/HeadCode.cs b/CommonLibrary/HeadCode.cs index 9b8c959..148eac5 100644 --- a/CommonLibrary/HeadCode.cs +++ b/CommonLibrary/HeadCode.cs @@ -15,47 +15,48 @@ namespace CommonLibrary /// public static Guid KeyToken { get; set; } = new Guid("1275BB9A-14B2-4A96-9673-B0AF0463D474"); - + + /// - /// 同步通信的头说明,以字母A开头,后面接B,C,D,E,F + /// 同步通信的指令头说明,以10000开头,后面接20000,30000, /// [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Auto)] public class SimplifyHeadCode { - public static string 维护检查 { get; } = "A001";//A开始的表明是系统相关的 - public static string 更新检查 { get; } = "A002"; - public static string 账户检查 { get; } = "A003"; - public static string 参数下载 { get; } = "A004"; - public static string 密码修改 { get; } = "A005"; - public static string 更细账户信息 { get; } = "A006"; - public static string 获取账户信息 { get; } = "A007"; - public static string 更新公告 { get; } = "A008"; - public static string 注册账号 { get; } = "A009"; - public static string 更新版本号 { get; } = "A010"; - public static string 请求文件列表 { get; } = "A011"; - public static string 意见反馈 { get; } = "A012"; + public static int 维护检查 { get; } = 10000;//10000开始的表明是系统相关的 + public static int 更新检查 { get; } = 10001; + public static int 账户检查 { get; } = 10002; + public static int 参数下载 { get; } = 10003; + public static int 密码修改 { get; } = 10004; + public static int 更细账户 { get; } = 10005; + public static int 获取账户 { get; } = 10006; + public static int 更新公告 { get; } = 10007; + public static int 注册账号 { get; } = 10008; + public static int 更新版本 { get; } = 10009; + public static int 请求文件 { get; } = 10010; + public static int 意见反馈 { get; } = 10011; - public static string 网络日志查看 { get; } = "B001";//B开头的是日志请求和清空 - public static string 网络日志清空 { get; } = "B002"; - public static string 同步日志查看 { get; } = "B003"; - public static string 同步日志清空 { get; } = "B004"; - public static string 更新日志查看 { get; } = "B005"; - public static string 更新日志清空 { get; } = "B006"; - public static string 运行日志查看 { get; } = "B007"; - public static string 运行日志清空 { get; } = "B008"; - public static string 共享文件日志查看 { get; } = "B009"; - public static string 共享文件日志清空 { get; } = "B010"; - public static string 建议反馈日志查看 { get; } = "B011"; - public static string 建议反馈日志清空 { get; } = "B012"; - public static string UDP日志查看 { get; } = "B013"; - public static string UDP日志清空 { get; } = "B014"; + public static int 网络日志查看 { get; } = 11000;//11000开头的是日志请求和清空 + public static int 网络日志清空 { get; } = 11001; + public static int 同步日志查看 { get; } = 11002; + public static int 同步日志清空 { get; } = 11003; + public static int 更新日志查看 { get; } = 11004; + public static int 更新日志清空 { get; } = 11005; + public static int 运行日志查看 { get; } = 11006; + public static int 运行日志清空 { get; } = 11007; + public static int 文件日志查看 { get; } = 11008; + public static int 文件日志清空 { get; } = 11009; + public static int 反馈日志查看 { get; } = 11010; + public static int 反馈日志清空 { get; } = 11011; + public static int UDP日志查看 { get; } = 11012; + public static int UDP日志清空 { get; } = 11013; /************************************************************************************** * - * 为了保证您的指令头不和系统的冲突,您的指令头应该以C,D,E,F开头 + * 为了保证您的指令头不和系统的冲突,您的指令头应该以20000之后开头 * **************************************************************************************/ @@ -65,13 +66,13 @@ namespace CommonLibrary /// public class MultiNetHeadCode { - public static string 所有客户端在线信息 { get; } = "H001"; - public static string 关闭所有客户端 { get; } = "H002"; - public static string 弹窗消息 { get; } = "H003"; - public static string 时间推送 { get; } = "H004"; - public static string 文件数量 { get; } = "H005"; - public static string 初始化数据 { get; } = "H006"; - public static string 留言消息 { get; } = "H007"; + public static int 总在线信息 { get; } = 50000; + public static int 关闭客户端 { get; } = 50001; + public static int 弹窗新消息 { get; } = 50002; + public static int 时间的推送 { get; } = 50003; + public static int 文件总数量 { get; } = 50004; + public static int 初始化数据 { get; } = 50005; + public static int 留言版消息 { get; } = 50006; /************************************************************************************** diff --git a/Public/HslCommunication.dll b/Public/HslCommunication.dll index 949e39a..42d488a 100644 Binary files a/Public/HslCommunication.dll and b/Public/HslCommunication.dll differ diff --git a/Public/HslCommunication.xml b/Public/HslCommunication.xml index e6d3709..fd8185b 100644 --- a/Public/HslCommunication.xml +++ b/Public/HslCommunication.xml @@ -532,6 +532,116 @@ + + + 一个线程安全且高性能的日志记录类,文件格式为txt,编码为ANSI,支持4中消息等级的划分 + + + + + 普通的消息等级 + + + + + 信息的消息等级 + + + + + 警告的消息等级 + + + + + 错误的消息等级 + + + + + 日志记录的路径,如果没有设置将不进行保存 + + + + + 获取或设置日志存储的次数 + + + + + 文件的存储读取锁 + + + + + 日志列表操作的安全锁 + + + + + 等待存储的日志的集合 + + + + + 用于保存一般日志级别内容的方法 + + 需要保存的字符串 + + + + 用于保存信息级别日志内容的方法 + + + + + + 用于保存警告级别日志内容的方法 + + + + + + 用于保存错误日志内容的方法 + + + + + + 用于内部保存日志内容的方法 + + + + + + + 文件的存储状态,0表示未存储,1表示存储中 + + + + + 存储一个异常和简单描述的信息 + + + + + + + 用于存储一个异常的方法 + + + + + + 调用此方法可以获得所有的日志信息,可以用来回发给客户端查看 + + + + + + 用于清空日志的所有内容,可以从外部调用 + + 软件的邮箱类,用于发送邮箱数据,连续发送10次失败则禁止发送 @@ -707,11 +817,6 @@ 流水号数字的标准长度,不够补0 流水号存储的文本位置 - - - 文件的保存状态 - - 当前的生成序列号 @@ -762,6 +867,11 @@ 指定一个新的文本头 + + + 高性能存储块 + + 包含整型和字符串描述的数据类型 @@ -859,6 +969,7 @@ 数据库的连接字符串 sql语句,适合插入,更新,删除 返回受影响的行数 + @@ -867,6 +978,7 @@ 数据库的连接对象 sql语句,适合插入,更新,删除 返回受影响的行数 + @@ -875,6 +987,8 @@ 数据库的连接字符串 sql语句,选择数据表的语句 结果数据表 + + @@ -883,6 +997,7 @@ 数据库连接对象 sql语句,选择数据表的语句 结果数据表 + @@ -891,6 +1006,8 @@ 数据库的连接字符串 sql语句,选择数据表的语句 结果数据集合 + + @@ -899,6 +1016,8 @@ 数据库的连接对象 sql语句,选择数据表的语句 结果数据集合 + + @@ -907,6 +1026,8 @@ 数据库的连接字符串 sql语句,选择数据表的语句 结果数据 + + @@ -915,6 +1036,8 @@ 数据库的连接对象 sql语句,选择数据表的语句 结果数据 + + @@ -1052,194 +1175,85 @@ - - - 一个线程安全且高性能的日志记录类,文件格式为txt,编码为ANSI,支持4中消息等级的划分 - - - - - 普通的消息等级 - - - - - 信息的消息等级 - - - - - 警告的消息等级 - - - - - 错误的消息等级 - - - - - 日志记录的路径,如果没有设置将不进行保存 - - - - - 获取或设置日志存储的次数 - - - - - 文件的存储读取锁 - - - - - 日志列表操作的安全锁 - - - - - 等待存储的日志的集合 - - - - - 写入文件的次数 - - - - - 用于保存一般日志级别内容的方法 - - 需要保存的字符串 - - - - 用于保存信息级别日志内容的方法 - - - - - - 用于保存警告级别日志内容的方法 - - - - - - 用于保存错误日志内容的方法 - - - - - - 用于内部保存日志内容的方法 - - - - - - - 文件的存储状态,0表示未存储,1表示存储中 - - - - - 存储一个异常和简单描述的信息 - - - - - - - 用于存储一个异常的方法 - - - - - - 调用此方法可以获得所有的日志信息,可以用来回发给客户端查看 - - - - - - 用于清空日志的所有内容,可以从外部调用 - - - + 用于本程序集访问通信的暗号说明 - + + + 规定所有的网络传输指令头都为32字节 + + + 用于心跳程序的暗号信息 - - - 说明发送的只是文本信息 - - - - - 发送的数据就是普通的字节数组 - - - + 客户端退出消息 - + 因为客户端达到上限而拒绝登录 - + 允许客户端登录到服务器 - + + + 说明发送的只是文本信息 + + + + + 发送的数据就是普通的字节数组 + + + + + 发送的数据就是普通的图片数据 + + + 请求文件下载的暗号 - + 请求文件上传的暗号 - + 文件校验成功 - + 文件校验失败 - + 文件保存失败 - + - 根据字符串数据生成带有暗号头的数据 + 不压缩数据字节 - - - + - 根据字节数据生成带有暗号头的数据 + 压缩数据字节 - - @@ -1397,69 +1411,69 @@ 使用代码编辑器修改此方法的内容。 - + 用来保存的文件信息类 - + 文件的名称 - + 文件的大小 - + 用于用户自定义的标识 - + 文件的上传人 - + 文件的上传日期 - + 文件的描述,说明备注 - + 文件在服务器的实际存储路径 - + 文件被下载的次数 - + 文件的后缀名 - + 获取大小 - + 获取文件对象显示图标 - + 根据文件后缀选择需要对应显示的文件图标,包含了二十多种常用文件的图标 @@ -1502,7 +1516,7 @@ - + 新增一个文件对象 @@ -1529,7 +1543,7 @@ - 根据 + 根据文件名称获取文件类型 @@ -1540,9 +1554,9 @@ - + - 将所有数据进行保存 + 一个乐观并发模型高性能执行类 @@ -1626,6 +1640,11 @@ 基于TCP的服务器引擎端核心类 + + + 实例化一个网络服务器类对象 + + 所支持的同时在线客户端的最大数量,商用限制1000个,最小10个 @@ -1637,7 +1656,20 @@ 示例:"#IP:{0} Name:{1}" + + + 客户端在线信息缓存 + + + + + 一个计算上线下线的高性能缓存对象 + + + + 计算所有客户端在线的信息 + 所有客户端的在线信息,使用#符号分隔开来 @@ -1704,44 +1736,45 @@ - - - 指令头接收方法 - - - - - - 数据内容接收方法 - - - - + 服务器端用于数据发送文本的方法 数据发送对象 + 用户自定义的数据对象,如不需要,赋值为0 发送的文本 - + 服务器端用于发送字节的方法 数据发送对象 + 用户自定义的数据对象,如不需要,赋值为0 实际发送的数据 - + 服务端用于发送所有数据到所有的客户端 - + 用户自定义的命令头 + 需要传送的实际的数据 - + 服务端用于发送所有数据到所有的客户端 + 用户自定义的命令头 需要群发客户端的字节数据 + + + 数据处理中心 + + + + + + 基于TCP通信的客户端核心类 @@ -1782,6 +1815,11 @@ 远程服务器的IP地址和端口 + + + 服务器的时间,自动实现和服务器同步 + + 系统与服务器的延时时间,单位毫秒 @@ -1822,30 +1860,29 @@ 启动客户端引擎,连接服务器系统 - - - 指令头接收方法 - - - - - - 数据内容接收方法 - - - - + 服务器端用于数据发送文本的方法 + 用户自定义的命令头 发送的文本 - + 服务器端用于发送字节的方法 + 用户自定义的命令头 实际发送的数据 + + + 客户端的数据处理中心 + + + + + + 心跳线程的方法 @@ -1863,26 +1900,36 @@ 服务器的通信地址 - + 客户端向服务器进行请求,请求字符串数据 - + 用户的指令头 + 发送数据 - + + + 客户端向服务器进行请求,请求字符串数据 + + 用户的指令头 + + + 客户端向服务器进行请求,请求字节数据 + 用户的指令头 - + 需要发送的底层数据 - 需要发送的底层数据 数据的指令头 + 用户的指令头 + 需要发送的底层数据 @@ -1916,19 +1963,21 @@ 关闭引擎 - + 向指定的通信对象发送字符串数据 - 通信对象 + 通信对象 + 用户的指令头 实际发送的字符串数据 - + 向指定的通信对象发送字节数据 - - + 连接对象 + 用户的指令头 + 实际的数据 @@ -1936,6 +1985,22 @@ + + + 处理异常的方法 + + + + + + + 数据处理中心 + + + + + + 用于服务器支持软件全自动更新升级的类 @@ -1970,7 +2035,7 @@ - 获取或设置一次接收时的数据长度 + 获取或设置一次接收时的数据长度,默认2KB数据长度 @@ -1984,6 +2049,13 @@ 关闭引擎 + + + 重新开始接收数据 + + + + 当接收到文本数据的时候,触发此事件 @@ -2005,17 +2077,25 @@ - + 发送字节数据到服务器 + 用户自定义的标记数据 字节数据 + + + - + 发送字符串数据到服务器 + 用户自定义的标记数据 字符串数据 + + + @@ -2040,7 +2120,7 @@ 服务器的端口号 - + 设置文件数据 @@ -2317,11 +2397,6 @@ UDP通信中的远程端 - - - 头子节数据标准长度 - - 指令头缓存 @@ -2416,6 +2491,145 @@ + + + 超时操作的类 [a class use to indicate the time-out of the connection] + + + + + 操作的开始时间 + + + + + 操作是否成功 + + + + + 延时的时间,单位毫秒 + + + + + 连接超时用的Socket + + + + + 静态的方法支持类,提供一些网络的静态支持 + + + + + 文件的读写缓存大小 + + + + + 检查是否超时的静态方法 + + + + + + + 判断两个字节是否相同 + + 第一个字节 + 第二个字节 + + + + + 判断两个字节的指定部分是否相同 + + 第一个字节 + 第一个字节的起始位置 + 第二个字节 + 第二个字节的起始位置 + 校验的长度 + 返回是否相等 + + + + + 读取socket数据的基础方法,只适合用来接收指令头,或是同步数据 + + 通信对象 + 接收的长度 + + + + + + + + + 读取socket指定长度数据并写入文件流中 + + 支持写入的文件流 + 连接的套接字 + 指定接收长度 + 是否回发进度 + + + + + + + + 读取socket指定长度数据并写入文件流中 + + 支持写入的文件流 + 指定接收长度 + 是否回发进度 + 套接字的属性 + + + + 读取文件流并将数据写入socket + + 文件流 + 连接的套接字 + 要写入的长度 + + + + 生成终极传送指令的方法,所有的数据均通过该方法出来 + + 命令头 + 自用自定义 + 令牌 + 字节数据 + + + + + 解析接收到数据,先解压缩后进行解密 + + + + + + + 获取发送字节数据的实际数据 + + + + + + + + + + + + + + + 一个网络通信类的基础类 @@ -2426,22 +2640,19 @@ 用于通信工作的核心对象 + + + 网络访问中的超时时间,单位:毫秒,默认值2200 + + 当前对象的身份令牌,用来在网络通信中标识唯一的验证 - + - 判断两个字节是否相同 - - 第一个字节 - 第二个字节 - - - - - 网络访问中的超时时间,单位:毫秒,默认值2200 + 分次接收的数据长度 @@ -2450,40 +2661,6 @@ - - - 读取socket数据的基础方法 - - 通信对象 - 接收的长度 - - - - - 读取socket指定长度数据并写入文件流中 - - 支持写入的文件流 - 连接的套接字 - 指定接收长度 - 是否回发进度 - - - - 读取socket指定长度数据并写入文件流中 - - 支持写入的文件流 - 指定接收长度 - 是否回发进度 - 套接字的属性 - - - - 读取文件流并将数据写入socket - - 文件流 - 连接的套接字 - 要写入的长度 - 不带参数的委托 @@ -2505,12 +2682,16 @@ object1 object2 - + - 将字节数组转化为16进制的字符串 + 带三个参数的委托 - 字节数组 - 字符串 + T1 + T2 + T3 + object1 + object2 + object3 @@ -2530,6 +2711,39 @@ + + + 重新开始接收下一次的数据传递 + + + + + + 指令头接收方法 + + + + + + 数据内容接收方法 + + + + + + 同步数据的接收的块 + + 网络的套接字 + + + + 数据处理中心,应该继承重写 + + 连接状态 + 协议头 + 用户自定义 + 数据内容 + 处理异常的方法,该方法需要在服务器端进行重写 @@ -2537,14 +2751,6 @@ - - - 用于同步通信中数据转换成实际发送的数据 - - 等待发送的数据 - 数据头 - 实际发送的数据 - 指示是否在发送结束后关闭套接字 @@ -2663,27 +2869,42 @@ 修改数据的算法 - + - 操作结果的类 + 一个用于高性能,乐观并发模型控制操作的类 - + + + 操作状态,0是未操作,1是操作中 + + + + + 需要操作的次数 + + + + + 操作结果的类,只带有成功标志和错误信息 + + + 指示本次访问是否成功 - + 具体的错误描述 - + 具体的错误代码 - + 获取错误代号及文本描述 @@ -2691,7 +2912,7 @@ - 操作结果的字符串类 + 操作结果的类,除了带有成功标志和错误信息,还带有一个字符串数据 @@ -2701,7 +2922,7 @@ - 操作结果的字节数组类 + 操作结果的类,除了带有成功标志和错误信息,还带有一个字节数据 @@ -2865,7 +3086,7 @@ - 异步的多PLC请求类,可以同时并发的向多个PLC发起请求,该类使用非阻塞的高性能方式实现 + 异步的多PLC请求类,可以同时并发的向多个PLC发起请求,该类使用非阻塞的高性能方式实现,需要好好测试 @@ -3811,25 +4032,24 @@ 根据自定义初始化方法进行初始化串口信息 - + - 超时连接的类 [a class use to indicate the time-out of the connection] + 一个负责压缩解压数据字节的类 - + - 开始连接或是请求的时间 + 压缩字节数据 + 等待被压缩的数据 + 压缩之后的数据 - + - 获取或设置是否连接成功,默认为False - - - - - 用于连接或是工作的套接字 + 解压压缩后的数据 + 压缩后的数据 + 压缩前的原始数据 diff --git a/软件系统客户端模版/FormDownloading.cs b/软件系统客户端模版/FormDownloading.cs index 5bb4db5..12b9b66 100644 --- a/软件系统客户端模版/FormDownloading.cs +++ b/软件系统客户端模版/FormDownloading.cs @@ -22,10 +22,10 @@ namespace 软件系统客户端模版 public partial class FormDownloading : Form { - public FormDownloading(string cmd,Action action) + public FormDownloading(int customer,Action action) { InitializeComponent(); - net_cmd = cmd; + net_cmd = customer; DealWithResult = action; DoubleBuffered = true; } @@ -84,7 +84,7 @@ namespace 软件系统客户端模版 } - private string net_cmd = ""; + private int net_cmd = 0; private Action DealWithResult = null; private void ThreadRequestServer() diff --git a/软件系统客户端模版/FormLog.cs b/软件系统客户端模版/FormLog.cs index 7ae42e8..30e3657 100644 --- a/软件系统客户端模版/FormLog.cs +++ b/软件系统客户端模版/FormLog.cs @@ -30,7 +30,7 @@ namespace 软件系统客户端模版 } - private void ReadFromServer(string head_code) + private void ReadFromServer(int head_code) { OperateResultString result = net_simplify_client.ReadFromServer(head_code); if (result.IsSuccess) @@ -40,7 +40,7 @@ namespace 软件系统客户端模版 } else textBox1.Text = result.ToMessageShowString(); } - private void ClearFromServer(string head_code) + private void ClearFromServer(int head_code) { OperateResultString result = net_simplify_client.ReadFromServer(head_code); if (result.IsSuccess) textBox1.Text = "清除成功"; @@ -88,22 +88,22 @@ namespace 软件系统客户端模版 } private void userButton9_Click(object sender, EventArgs e) { - ReadFromServer(CommonHeadCode.SimplifyHeadCode.共享文件日志查看); + ReadFromServer(CommonHeadCode.SimplifyHeadCode.文件日志查看); } private void userButton8_Click(object sender, EventArgs e) { - ClearFromServer(CommonHeadCode.SimplifyHeadCode.共享文件日志清空); + ClearFromServer(CommonHeadCode.SimplifyHeadCode.文件日志清空); } private void userButton11_Click(object sender, EventArgs e) { - ReadFromServer(CommonHeadCode.SimplifyHeadCode.建议反馈日志查看); + ReadFromServer(CommonHeadCode.SimplifyHeadCode.反馈日志查看); } private void userButton10_Click(object sender, EventArgs e) { - ClearFromServer(CommonHeadCode.SimplifyHeadCode.建议反馈日志清空); + ClearFromServer(CommonHeadCode.SimplifyHeadCode.反馈日志清空); } private void userButton13_Click(object sender, EventArgs e) { diff --git a/软件系统客户端模版/FormLogin.cs b/软件系统客户端模版/FormLogin.cs index 07a6685..493e437 100644 --- a/软件系统客户端模版/FormLogin.cs +++ b/软件系统客户端模版/FormLogin.cs @@ -93,6 +93,7 @@ namespace 软件系统客户端模版 private void userButton_login_Click(object sender, EventArgs e) { + label_status.Visible = true; //验证输入 if (string.IsNullOrEmpty(textBox_userName.Text)) @@ -174,6 +175,7 @@ namespace 软件系统客户端模版 OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonLibrary.CommonHeadCode.SimplifyHeadCode.维护检查); if(result.IsSuccess) { + byte[] temp = Encoding.Unicode.GetBytes(result.Content); //例如返回结果为1说明允许登录,0则说明服务器处于维护中,并将信息显示 if (result.Content != "1") { @@ -204,11 +206,12 @@ namespace 软件系统客户端模版 // 以下展示了服务器校验的方法,如您需要数据库校验,请删除下面并改成SQL访问验证的方式 //包装数据 - Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject(); - json.Add(UserAccount.UserNameText, new Newtonsoft.Json.Linq.JValue(textBox_userName.Text)); - json.Add(UserAccount.PasswordText, new Newtonsoft.Json.Linq.JValue(textBox_password.Text)); - - result = UserClient.Net_simplify_client.ReadFromServer(CommonLibrary.CommonHeadCode.SimplifyHeadCode.账户检查+json.ToString()); + JObject json = new JObject + { + { UserAccount.UserNameText, new Newtonsoft.Json.Linq.JValue(textBox_userName.Text) }, + { UserAccount.PasswordText, new Newtonsoft.Json.Linq.JValue(textBox_password.Text) } + }; + result = UserClient.Net_simplify_client.ReadFromServer(CommonLibrary.CommonHeadCode.SimplifyHeadCode.账户检查, json.ToString()); if (result.IsSuccess) { //服务器应该返回账户的信息 diff --git a/软件系统客户端模版/FormMainWindow.cs b/软件系统客户端模版/FormMainWindow.cs index 2205b20..04dcdeb 100644 --- a/软件系统客户端模版/FormMainWindow.cs +++ b/软件系统客户端模版/FormMainWindow.cs @@ -16,7 +16,7 @@ using HslCommunication.BasicFramework; /*************************************************************************************** * - * 模版日期 2017-05-20 + * 模版日期 2017-06-16 * 创建人 胡少林 * 版权所有 胡少林 * 授权说明 模版仅授权个人使用,如需商用,请联系hsl200909@163.com洽谈 @@ -56,7 +56,7 @@ namespace 软件系统客户端模版 private void FormMainWindow_Load(object sender, EventArgs e) { //udp测试 - //SendServerUdpData("载入了窗体"); + //SendServerUdpData(0, "载入了窗体"); //窗口载入 label_userName.Text = UserClient.UserAccount.UserName; @@ -94,7 +94,7 @@ namespace 软件系统客户端模版 IsWindowShow = true; //udp测试 - //SendServerUdpData("显示了窗体"); + //SendServerUdpData(0, "显示了窗体"); //是否显示更新日志,显示前进行判断该版本是否已经显示过了 if (UserClient.JsonSettings.IsNewVersionRunning) @@ -111,6 +111,8 @@ namespace 软件系统客户端模版 账户管理ToolStripMenuItem.Enabled = false; 远程更新ToolStripMenuItem.Enabled = false; } + //启动定时器 + TimeTickInitilization(); } private void FormMainWindow_FormClosing(object sender, FormClosingEventArgs e) { @@ -141,7 +143,7 @@ namespace 软件系统客户端模版 { UserAccount.UserNameText, UserClient.UserAccount.UserName }, { UserAccount.PasswordText, p } }; - return UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.密码修改 + json.ToString()).IsSuccess; + return UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.密码修改, json.ToString()).IsSuccess; }, 6, 8)) { fpm.ShowDialog(); @@ -182,7 +184,7 @@ namespace 软件系统客户端模版 private void 更改公告ToolStripMenuItem_Click(object sender, EventArgs e) { using (FormInputAndAction fiaa = new FormInputAndAction(str => UserClient.Net_simplify_client.ReadFromServer( - CommonHeadCode.SimplifyHeadCode.更新公告 + str).IsSuccess, UserClient.Announcement, "请输入公告内容")) + CommonHeadCode.SimplifyHeadCode.更新公告, str).IsSuccess, UserClient.Announcement, "请输入公告内容")) { fiaa.ShowDialog(); } @@ -208,10 +210,10 @@ namespace 软件系统客户端模版 { FormAccountManage fam = new FormAccountManage(() => { - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.获取账户信息); + OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.获取账户); if (result.IsSuccess) return result.Content; else return result.ToMessageShowString(); - }, m => UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.更细账户信息 + m).IsSuccess); + }, m => UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.更细账户, m).IsSuccess); fam.ShowDialog(); fam.Dispose(); } @@ -246,7 +248,7 @@ namespace 软件系统客户端模版 private void 意见反馈ToolStripMenuItem_Click(object sender, EventArgs e) { using (FormInputAndAction fiaa = new FormInputAndAction(str => UserClient.Net_simplify_client.ReadFromServer( - CommonHeadCode.SimplifyHeadCode.意见反馈 + UserClient.UserAccount.UserName + ":" + str).IsSuccess, "", "请输入意见反馈:")) + CommonHeadCode.SimplifyHeadCode.意见反馈, UserClient.UserAccount.UserName + ":" + str).IsSuccess, "", "请输入意见反馈:")) { fiaa.ShowDialog(); } @@ -274,48 +276,51 @@ namespace 软件系统客户端模版 SoftBasic.ShowExceptionMessage(ex); } } - - private void Net_socket_client_AcceptString(AsyncStateOne object1, string object2) + /// + /// 接收到服务器的字节数据的回调方法 + /// + /// 网络连接对象 + /// 用户自定义的指令头,用来区分数据用途 + /// 数据 + private void Net_socket_client_AcceptString(AsyncStateOne state, int customer, string data) { - //接收到服务器发来的字符串数据 - string head_code = object2.Substring(0, 4); - if (head_code == CommonHeadCode.MultiNetHeadCode.弹窗消息) + if (customer == CommonHeadCode.MultiNetHeadCode.弹窗新消息) { if (IsHandleCreated) Invoke(new Action(() => { - FormPopup fpp = new FormPopup(object2.Substring(4), Color.DodgerBlue, 10000); + FormPopup fpp = new FormPopup(data, Color.DodgerBlue, 10000); fpp.Show(); })); } - else if (head_code == CommonHeadCode.MultiNetHeadCode.所有客户端在线信息) + else if (customer == CommonHeadCode.MultiNetHeadCode.总在线信息) { if (IsHandleCreated) Invoke(new Action(() => { - listBox1.DataSource = object2.Substring(4).Split('#'); + listBox1.DataSource = data.Split('#'); })); } - else if (head_code == CommonHeadCode.MultiNetHeadCode.关闭所有客户端) + else if (customer == CommonHeadCode.MultiNetHeadCode.关闭客户端) { if (IsHandleCreated) Invoke(new Action(() => { Close(); })); } - else if (head_code == CommonHeadCode.SimplifyHeadCode.更新公告) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新公告) { //此处应用到了同步类的指令头 if (IsHandleCreated) Invoke(new Action(() => { - UserClient.Announcement = object2.Substring(4); - label_Announcement.Text = object2.Substring(4); - FormPopup fpp = new FormPopup(object2.Substring(4), Color.DodgerBlue, 10000); + UserClient.Announcement = data; + label_Announcement.Text = data; + FormPopup fpp = new FormPopup(data, Color.DodgerBlue, 10000); fpp.Show(); })); } - else if (head_code == CommonHeadCode.MultiNetHeadCode.初始化数据) + else if (customer == CommonHeadCode.MultiNetHeadCode.初始化数据) { //收到服务器的数据 - JObject json = JObject.Parse(object2.Substring(4)); + JObject json = JObject.Parse(data); UserClient.DateTimeServer = json["Time"].ToObject(); if (IsHandleCreated) Invoke(new Action(() => { @@ -323,36 +328,28 @@ namespace 软件系统客户端模版 label_file_count.Text = json["FileCount"].ToObject().ToString(); })); } - else if (head_code == CommonHeadCode.MultiNetHeadCode.文件数量) + else if (customer == CommonHeadCode.MultiNetHeadCode.文件总数量) { if (IsHandleCreated) Invoke(new Action(() => { - label_file_count.Text = object2.Substring(4); + label_file_count.Text = data; })); } - else if (head_code == CommonHeadCode.MultiNetHeadCode.时间推送) - { - UserClient.DateTimeServer = Convert.ToDateTime(object2.Substring(4)); - if (IsHandleCreated) Invoke(new Action(() => - { - toolStripStatusLabel_time.Text = UserClient.DateTimeServer.ToString("yyyy-MM-dd HH:mm") + $"({net_socket_client.DelayTime}ms)"; - })); - } - else if (head_code == CommonHeadCode.MultiNetHeadCode.留言消息) + else if (customer == CommonHeadCode.MultiNetHeadCode.留言版消息) { if (IsHandleCreated) Invoke(new Action(() => { - UIControls_Chat?.DealwithReceive(object2.Substring(4)); + UIControls_Chat?.DealwithReceive(data); })); } } - private void Net_socket_client_AcceptByte(AsyncStateOne object1, byte[] object2) + private void Net_socket_client_AcceptByte(AsyncStateOne object1, int customer, byte[] object2) { //接收到服务器发来的字节数据 if (IsHandleCreated) Invoke(new Action(() => { - MessageBox.Show(BitConverter.ToInt32(object2, 0).ToString()); + MessageBox.Show(customer.ToString()); })); } @@ -439,7 +436,7 @@ namespace 软件系统客户端模版 UIControls_Chat = new UIControls.OnlineChatRender((m) => { - net_socket_client.Send(CommonHeadCode.MultiNetHeadCode.留言消息 + m); + net_socket_client.Send(CommonHeadCode.MultiNetHeadCode.留言版消息, m); }) { Visible = false, @@ -491,12 +488,82 @@ namespace 软件系统客户端模版 /// 调用该方法并指定参数即可,最长字符串不得 /// /// - private void SendServerUdpData(string data) + private void SendServerUdpData(int customer, string data) { //测试发送udp消息 - UserClient.Net_Udp_Client.SendMessage(data); + UserClient.Net_Udp_Client.SendMessage(customer, data); } + #endregion + + #region 后台计数线程 + + /********************************************************************************************* + * + * 说明 一个后台线程,用来执行一些周期执行的东西 + * 注意 它不仅执行每秒触发的代码,也支持每分钟,每天,每月,每年等等 + * + ********************************************************************************************/ + + + /// + /// 初始化后台的计数线程 + /// + public void TimeTickInitilization() + { + + Thread thread = new Thread(new ThreadStart(ThreadTimeTick)); + thread.IsBackground = true; + thread.Start(); + } + + public void ThreadTimeTick() + { + Thread.Sleep(300);//加一个微小的延时 + int second = DateTime.Now.Second - 1; + int minute = -1; + int hour = -1; + int day = -1; + Action DTimeShow = delegate + { + //显示服务器的时间和当前网络的延时时间,通常为毫秒 + toolStripStatusLabel_time.Text = net_socket_client.ServerTime.ToString("yyyy-MM-dd HH:mm:ss") + $"({net_socket_client.DelayTime}ms)"; + }; + + while (IsWindowShow) + { + while (DateTime.Now.Second == second) + { + Thread.Sleep(20); + } + second = DateTime.Now.Second; + if (IsWindowShow && IsHandleCreated) Invoke(DTimeShow); + //每秒钟执行的代码 + UserClient.DateTimeServer = net_socket_client.ServerTime; + + if (second == 0) + { + //每个0秒执行的代码 + } + if (minute != DateTime.Now.Minute) + { + minute = DateTime.Now.Minute; + //每分钟执行的代码 + } + if (hour != DateTime.Now.Hour) + { + hour = DateTime.Now.Hour; + //每小时执行的代码 + } + if (day != DateTime.Now.Day) + { + day = DateTime.Now.Day; + //每天执行的代码 + } + } + } + + #endregion } } diff --git a/软件系统客户端模版/FormRegisterAccount.cs b/软件系统客户端模版/FormRegisterAccount.cs index a0a7897..de92fc8 100644 --- a/软件系统客户端模版/FormRegisterAccount.cs +++ b/软件系统客户端模版/FormRegisterAccount.cs @@ -51,7 +51,7 @@ namespace 软件系统客户端模版 account.LoginEnable = comboBox2.SelectedItem.ToString() == "允许"; account.ForbidMessage = textBox4.Text; - OperateResultString result = net_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.注册账号 + account.ToJsonString()); + OperateResultString result = net_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.注册账号, account.ToJsonString()); if (result.IsSuccess && result.Content == "1") { MessageBox.Show("注册成功!"); diff --git a/软件系统客户端模版/FormUpdateRemote.cs b/软件系统客户端模版/FormUpdateRemote.cs index 9d80508..66571ff 100644 --- a/软件系统客户端模版/FormUpdateRemote.cs +++ b/软件系统客户端模版/FormUpdateRemote.cs @@ -48,8 +48,7 @@ namespace 软件系统客户端模版 private void userButton_version_Click(object sender, EventArgs e) { - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.更新版本号 + - textBox1.Text); + OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.更新版本, textBox1.Text); if (result.IsSuccess && result.Content == "1") { MessageBox.Show("更新成功!"); diff --git a/软件系统客户端模版/UIControls/ShareFilesRender.cs b/软件系统客户端模版/UIControls/ShareFilesRender.cs index 6208b63..3f72234 100644 --- a/软件系统客户端模版/UIControls/ShareFilesRender.cs +++ b/软件系统客户端模版/UIControls/ShareFilesRender.cs @@ -43,10 +43,10 @@ namespace 软件系统客户端模版.UIControls private void userButton_refresh_Click(object sender, EventArgs e) { //向服务器请求数据 - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonLibrary.CommonHeadCode.SimplifyHeadCode.请求文件列表); + OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(CommonLibrary.CommonHeadCode.SimplifyHeadCode.请求文件); if(result.IsSuccess) { - Cache_Files = JArray.Parse(result.Content).ToObject>(); + Cache_Files = JArray.Parse(result.Content).ToObject>(); SetFilesShow(Cache_Files); } else @@ -55,7 +55,7 @@ namespace 软件系统客户端模版.UIControls } } - private void SetFilesShow(List files) + private void SetFilesShow(List files) { panel2.SuspendLayout(); //清楚缓存 @@ -113,7 +113,7 @@ namespace 软件系统客户端模版.UIControls /// /// 所有文件信息的缓存,以支持直接的搜索 /// - private List Cache_Files { get; set; } = new List(); + private List Cache_Files { get; set; } = new List(); /// /// 文件控件的缓存列表,方便清除垃圾 /// diff --git a/软件系统客户端模版/UserClient.cs b/软件系统客户端模版/UserClient.cs index 0edb85a..922765d 100644 --- a/软件系统客户端模版/UserClient.cs +++ b/软件系统客户端模版/UserClient.cs @@ -69,12 +69,17 @@ namespace 软件系统客户端模版 CommonLibrary.CommonLibrary.Port_Second_Net)) { KeyToken = CommonHeadCode.KeyToken, + ConnectTimeout = 5000, }; /// /// 用于使用udp向服务器进行发送即时可丢失数据的对象 /// - public static Net_Udp_Client Net_Udp_Client = new Net_Udp_Client(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ServerIp), - CommonLibrary.CommonLibrary.Port_Udp_Server)); + public static Net_Udp_Client Net_Udp_Client = new Net_Udp_Client( + new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ServerIp), + CommonLibrary.CommonLibrary.Port_Udp_Server)) + { + KeyToken = CommonHeadCode.KeyToken, + }; } } diff --git a/软件系统客户端模版/软件系统客户端模版.csproj b/软件系统客户端模版/软件系统客户端模版.csproj index 5fb8654..2131c0e 100644 --- a/软件系统客户端模版/软件系统客户端模版.csproj +++ b/软件系统客户端模版/软件系统客户端模版.csproj @@ -35,7 +35,7 @@ ..\CommonLibrary\bin\Debug\CommonLibrary.dll - + False ..\Public\HslCommunication.dll diff --git a/软件系统服务端模版/Form1.cs b/软件系统服务端模版/Form1.cs index b6b4dae..99c1fe9 100644 --- a/软件系统服务端模版/Form1.cs +++ b/软件系统服务端模版/Form1.cs @@ -15,7 +15,7 @@ using HslCommunication.BasicFramework; /****************************************************************************************** * - * 模版日期 2017-05-30 + * 模版日期 2017-06-16 * 创建人 Richard.Hu * 版权所有 Richard.Hu * 授权说明 模版仅授权个人使用,如需商用,请联系hsl200909@163.com洽谈 @@ -167,7 +167,7 @@ namespace 软件系统服务端模版 using (FormInputAndAction fiaa = new FormInputAndAction( m => { - net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.弹窗消息 + m); return true; + net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.弹窗新消息, m); return true; })) { fiaa.ShowDialog(); @@ -177,7 +177,7 @@ namespace 软件系统服务端模版 private void 一键断开ToolStripMenuItem_Click(object sender, EventArgs e) { //关闭信号发送至所有在线客户端 - net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.关闭所有客户端); + net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.关闭客户端, ""); } private void 关于软件ToolStripMenuItem_Click(object sender, EventArgs e) @@ -305,31 +305,45 @@ namespace 软件系统服务端模版 /// /// 接收来自客户端的字节数据 /// - /// 客户端的地址 - /// 字节数据,根据实际情况选择是否使用 - private void Net_simplify_server_ReceivedBytesEvent(AsyncStateBase object1, byte[] object2) + /// 网络状态 + /// 字节数据,根据实际情况选择是否使用 + /// 来自客户端的字节数据 + private void Net_simplify_server_ReceivedBytesEvent(AsyncStateOne state, int customer, byte[] data) { - net_simplify_server.SendMessage(object1, object2); + net_simplify_server.SendMessage(state, customer, data); } + + + + + /****************************************************************************************************************** + * + * 方法说明: 当接收到来自客户端的数据的时候触发的方法 + * 特别注意: 如果你的数据处理中引发了异常,应用程序将会奔溃,SendMessage异常系统将会自动处理 + * + ******************************************************************************************************************/ + + /// /// 接收到来自客户端的数据,此处需要放置维护验证,更新验证等等操作 /// - /// 客户端的地址 - /// 消息数据,应该使用指令头+数据组成 - private void Net_simplify_server_ReceiveStringEvent(AsyncStateBase object1, string object2) + /// 客户端的地址 + /// 用于自定义的指令头,可不用,转而使用data来区分 + /// 接收到的服务器的数据 + private void Net_simplify_server_ReceiveStringEvent(AsyncStateOne state, int customer, string data) { //必须返回结果,调用SendMessage(object1,[实际数据]); - if (object2.StartsWith("A")) + if (customer < 11000) { - DataProcessingWithStartA(object1, object2); + DataProcessingWithStartA(state, customer, data); } - else if (object2.StartsWith("B")) + else if (customer < 12000) { - DataProcessingWithStartB(object1, object2); + DataProcessingWithStartB(state, customer, data); } else { - net_simplify_server.SendMessage(object1, object2); + net_simplify_server.SendMessage(state, customer, data); } } @@ -344,186 +358,186 @@ namespace 软件系统服务端模版 /// /// A指令块,处理系统基础运行的消息 /// - /// 网络状态对象 - /// 实际的数据 - private void DataProcessingWithStartA(AsyncStateBase object1, string object2) + /// 网络状态对象 + /// 实际的数据 + private void DataProcessingWithStartA(AsyncStateOne state, int customer, string data) { - string headCode = object2.Substring(0, 4); - if (headCode == CommonHeadCode.SimplifyHeadCode.维护检查) + if (customer == CommonHeadCode.SimplifyHeadCode.维护检查) { - net_simplify_server.SendMessage(object1, UserServer.ServerSettings.Can_Account_Login ? "1" : "0" + - UserServer.ServerSettings.Account_Forbidden_Reason); + net_simplify_server.SendMessage(state, customer, "1"); + //UserServer.ServerSettings.Can_Account_Login ? "1" : "0" + + //UserServer.ServerSettings.Account_Forbidden_Reason); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更新检查) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新检查) { - net_simplify_server.SendMessage(object1, UserServer.ServerSettings.SystemVersion.ToString()); + net_simplify_server.SendMessage(state, customer, UserServer.ServerSettings.SystemVersion.ToString()); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.参数下载) + else if (customer == CommonHeadCode.SimplifyHeadCode.参数下载) { Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject(); json.Add(nameof(UserServer.ServerSettings.Announcement), new Newtonsoft.Json.Linq.JValue(UserServer.ServerSettings.Announcement)); - net_simplify_server.SendMessage(object1, json.ToString()); + net_simplify_server.SendMessage(state, customer, json.ToString()); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.账户检查) + else if (customer == CommonHeadCode.SimplifyHeadCode.账户检查) { //此处使用的是组件自带的验证的方式,如果使用SQL数据库,另行验证 - JObject json = JObject.Parse(object2.Substring(4)); + JObject json = JObject.Parse(data); //提取账户,密码 string name = SoftBasic.GetValueFromJsonObject(json, UserAccount.UserNameText, ""); string password = SoftBasic.GetValueFromJsonObject(json, UserAccount.PasswordText, ""); - net_simplify_server.SendMessage(object1, UserServer.ServerAccounts.CheckAccountJson( - name, password, object1.GetRemoteEndPoint().Address.ToString())); + net_simplify_server.SendMessage(state, customer, UserServer.ServerAccounts.CheckAccountJson( + name, password, state.GetRemoteEndPoint().Address.ToString())); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更新公告) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新公告) { - UserServer.ServerSettings.Announcement = object2.Substring(4); + UserServer.ServerSettings.Announcement = data; //通知所有客户端更新公告 - net_socket_server.SendAllClients(object2); - net_simplify_server.SendMessage(object1, "成功"); + net_socket_server.SendAllClients(customer, data); + net_simplify_server.SendMessage(state, customer, "成功"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.获取账户信息) + else if (customer == CommonHeadCode.SimplifyHeadCode.获取账户) { //返回服务器的账户信息 - net_simplify_server.SendMessage(object1, UserServer.ServerAccounts.GetAllAccountsJson()); + net_simplify_server.SendMessage(state, customer, UserServer.ServerAccounts.GetAllAccountsJson()); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更细账户信息) + else if (customer == CommonHeadCode.SimplifyHeadCode.更细账户) { //更新服务器的账户信息 - UserServer.ServerAccounts.LoadAllAccountsJson(object2.Substring(4)); - net_simplify_server.SendMessage(object1, "成功"); + UserServer.ServerAccounts.LoadAllAccountsJson(data); + net_simplify_server.SendMessage(state, customer, "成功"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.密码修改) + else if (customer == CommonHeadCode.SimplifyHeadCode.密码修改) { //更新服务器的账户密码,此处使用的是组件自带的验证的方式,如果使用SQL数据库,另行验证 - JObject json = JObject.Parse(object2.Substring(4)); + JObject json = JObject.Parse(data); //提取账户,密码 string name = SoftBasic.GetValueFromJsonObject(json, UserAccount.UserNameText, ""); string password = SoftBasic.GetValueFromJsonObject(json, UserAccount.PasswordText, ""); UserServer.ServerAccounts.UpdatePassword(name, password); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更新版本号) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新版本) { try { - UserServer.ServerSettings.SystemVersion = new SystemVersion(object2.Substring(4)); + UserServer.ServerSettings.SystemVersion = new SystemVersion(data); UserServer.ServerSettings.SaveToFile(); toolStripStatusLabel_version.Text = UserServer.ServerSettings.SystemVersion.ToString(); - net_simplify_server.SendMessage(object1, "1"); + net_simplify_server.SendMessage(state, customer, "1"); } catch { - net_simplify_server.SendMessage(object1, "0"); + net_simplify_server.SendMessage(state, customer, "0"); } } - else if (headCode == CommonHeadCode.SimplifyHeadCode.注册账号) + else if (customer == CommonHeadCode.SimplifyHeadCode.注册账号) { - bool result = UserServer.ServerAccounts.AddNewAccount(object2.Substring(4)); - net_simplify_server.SendMessage(object1, result ? "1" : "0"); + bool result = UserServer.ServerAccounts.AddNewAccount(data); + net_simplify_server.SendMessage(state, customer, result ? "1" : "0"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.请求文件列表) + else if (customer == CommonHeadCode.SimplifyHeadCode.请求文件) { - net_simplify_server.SendMessage(object1, net_simple_file_server.ToJsonString()); + net_simplify_server.SendMessage(state, customer, net_simple_file_server.ToJsonString()); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.意见反馈) + else if (customer == CommonHeadCode.SimplifyHeadCode.意见反馈) { - AdviceLogHelper.SaveInformation(object2.Substring(4)); - net_simplify_server.SendMessage(object1, "成功"); + AdviceLogHelper.SaveInformation(data); + net_simplify_server.SendMessage(state, customer, "成功"); } else { - net_simplify_server.SendMessage(object1, object2); + net_simplify_server.SendMessage(state, customer, data); } } /// /// B指令块,处理日志相关的消息 /// - /// - /// - private void DataProcessingWithStartB(AsyncStateBase object1, string object2) + /// + /// 用户自定义的命令头 + /// + private void DataProcessingWithStartB(AsyncStateOne state, int customer, string data) { - string headCode = object2.Substring(0, 4); - if (headCode == CommonHeadCode.SimplifyHeadCode.网络日志查看) + if (customer == CommonHeadCode.SimplifyHeadCode.网络日志查看) { - net_simplify_server.SendMessage(object1, net_socket_server.LogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, net_socket_server.LogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("网络日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.网络日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.网络日志清空) { net_socket_server.LogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveWarnning("网络日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.同步日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.同步日志查看) { - net_simplify_server.SendMessage(object1, net_simplify_server.LogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, net_simplify_server.LogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("同步日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.同步日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.同步日志清空) { net_simplify_server.LogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveWarnning("同步日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更新日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新日志查看) { - net_simplify_server.SendMessage(object1, net_soft_update_Server.LogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, net_soft_update_Server.LogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("更新日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.更新日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.更新日志清空) { net_soft_update_Server.LogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveWarnning("更新日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.运行日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.运行日志查看) { - net_simplify_server.SendMessage(object1, RuntimeLogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, RuntimeLogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("运行日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.运行日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.运行日志清空) { RuntimeLogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveInformation("运行日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.共享文件日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.文件日志查看) { - net_simplify_server.SendMessage(object1, net_simple_file_server.LogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, net_simple_file_server.LogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("共享文件日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.共享文件日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.文件日志清空) { net_simple_file_server.LogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveInformation("共享文件日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.建议反馈日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.反馈日志查看) { - net_simplify_server.SendMessage(object1, AdviceLogHelper.GetLogText()); + net_simplify_server.SendMessage(state, customer, AdviceLogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("建议反馈日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.建议反馈日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.反馈日志清空) { AdviceLogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveWarnning("建议反馈日志清空"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.UDP日志查看) + else if (customer == CommonHeadCode.SimplifyHeadCode.UDP日志查看) { - net_simplify_server.SendMessage(object1, net_udp_server.LogHelper.GetLogText()); + net_simplify_server.SendMessage(state, 0, net_udp_server.LogHelper.GetLogText()); RuntimeLogHelper.SaveInformation("UDP日志查看"); } - else if (headCode == CommonHeadCode.SimplifyHeadCode.UDP日志清空) + else if (customer == CommonHeadCode.SimplifyHeadCode.UDP日志清空) { net_udp_server.LogHelper.ClearLogText(); - net_simplify_server.SendMessage(object1, "成功"); + net_simplify_server.SendMessage(state, customer, "成功"); RuntimeLogHelper.SaveWarnning("UDP日志清空"); } else { - net_simplify_server.SendMessage(object1, object2); + net_simplify_server.SendMessage(state, customer, data); } } @@ -557,11 +571,11 @@ namespace 软件系统服务端模版 net_socket_server.LogHelper.LogSaveFileName = Application.StartupPath + @"\net_log.txt"; net_socket_server.FormatClientOnline = "#IP:{0} Name:{1}";//必须为#开头,具体格式可由自身需求确定 net_socket_server.IsSaveLogClientLineChange = true;//设置客户端上下线是否记录到日志 - net_socket_server.ClientOnline += Net_socket_server_ClientOnline;//客户端上线触发 - net_socket_server.ClientOffline += Net_socket_server_ClientOffline;//客户端下线触发,包括异常掉线 - net_socket_server.MessageAlerts += Net_socket_server_MessageAlerts;//服务器产生提示消息触发 - net_socket_server.AcceptByte += Net_socket_server_AcceptByte;//服务器接收到字节数据触发 - net_socket_server.AcceptString += Net_socket_server_AcceptString;//服务器接收到字符串数据触发 + net_socket_server.ClientOnline += new HslCommunication.NetBase.IEDelegate(Net_socket_server_ClientOnline);//客户端上线触发 + net_socket_server.ClientOffline += new HslCommunication.NetBase.IEDelegate(Net_socket_server_ClientOffline);//客户端下线触发,包括异常掉线 + net_socket_server.MessageAlerts += new HslCommunication.NetBase.IEDelegate(Net_socket_server_MessageAlerts);//服务器产生提示消息触发 + net_socket_server.AcceptByte += new HslCommunication.NetBase.IEDelegate(Net_socket_server_AcceptByte);//服务器接收到字节数据触发 + net_socket_server.AcceptString += new HslCommunication.NetBase.IEDelegate(Net_socket_server_AcceptString);//服务器接收到字符串数据触发 net_socket_server.ServerStart(CommonLibrary.CommonLibrary.Port_Main_Net); } catch (Exception ex) @@ -570,13 +584,24 @@ namespace 软件系统服务端模版 } } - private void Net_socket_server_AcceptString(AsyncStateOne object1, string object2) + + + /****************************************************************************************************************** + * + * 方法说明: 当接收到来自客户端的数据的时候触发的方法 + * 特别注意: 如果你的数据处理中引发了异常,应用程序将会继续运行,该异常将会记录在网络日志中, + * 所以有必要的话,对可能发生的异常需要提前处理。 + * + ******************************************************************************************************************/ + + + private void Net_socket_server_AcceptString(AsyncStateOne object1, int customer, string data) { //如果此处充斥大量if语句,影响观感,则考虑进行指令头分类操作,客户端异步发送的字符串都会到此处处理 - if (object2.StartsWith("H")) + if (50000 <= customer && customer < 51000) { //H类系统指令 - DataProcessingWithStartH(object1, object2); + DataProcessingWithStartH(object1, customer, data); } } @@ -584,22 +609,21 @@ namespace 软件系统服务端模版 /// /// H开头的处理块 /// - /// - /// 指令头 - /// - private void DataProcessingWithStartH(AsyncStateOne object1, string object2) + /// 网络状态 + /// 用户自定义的指令头 + /// 字符串数据 + private void DataProcessingWithStartH(AsyncStateOne state, int customer, string data) { - string headCode = object2.Substring(0, 4); - if (headCode == CommonHeadCode.MultiNetHeadCode.留言消息) + if (customer == CommonHeadCode.MultiNetHeadCode.留言版消息) { - string content = headCode + object1.LoginAlias + DateTime.Now.ToString(" yyyy-MM-dd HH:mm:ss") + Environment.NewLine + object2.Substring(4); + string content = state.LoginAlias + DateTime.Now.ToString(" yyyy-MM-dd HH:mm:ss") + Environment.NewLine + data; //转发所有的客户端,包括发送者 - net_socket_server.SendAllClients(content); + net_socket_server.SendAllClients(customer, content); } } - private void Net_socket_server_AcceptByte(AsyncStateOne object1, byte[] object2) + private void Net_socket_server_AcceptByte(AsyncStateOne state, int customer, byte[] data) { //如果此处充斥大量if语句,影响观感,则考虑进行指令头分类操作,客户端异步发送的字节数组都会到此处处理 } @@ -630,11 +654,11 @@ namespace 软件系统服务端模版 { "Time", new JValue(DateTime.Now) }, { "FileCount", new JValue(net_simple_file_server.File_Count()) } }; - net_socket_server.Send(object1, CommonHeadCode.MultiNetHeadCode.初始化数据 + json.ToString()); + net_socket_server.Send(object1, CommonHeadCode.MultiNetHeadCode.初始化数据, json.ToString()); //此处决定要不要将在线客户端的数据发送所有客户端 - net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.所有客户端在线信息 + net_socket_server.AllClients); + net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.总在线信息, net_socket_server.AllClients); //触发上下线功能 Net_socket_clients_change(DateTime.Now.ToString("MM-dd HH:mm:ss ") + object1._IpEnd_Point.Address.ToString() + ":" + object1.LoginAlias + " 上线"); @@ -700,11 +724,12 @@ namespace 软件系统服务端模版 } second = DateTime.Now.Second; if (IsWindowShow && IsHandleCreated) Invoke(DTimeShow); - //每隔一分钟将时间发送给所有客户端,格式为标准时间 + //每秒钟执行的代码 + if (second == 0) { - net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.时间推送 + - DateTime.Now.ToString("O")); + //每个0秒执行的代码 + //net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.时间的推送, DateTime.Now.ToString("O")); } if (minute != DateTime.Now.Minute) { @@ -760,7 +785,7 @@ namespace 软件系统服务端模版 private void Net_simple_file_server_FileChange() { //将文件数据发送给客户端 - net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.文件数量 + net_simple_file_server.File_Count()); + net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.文件总数量, net_simple_file_server.File_Count().ToString()); } @@ -809,27 +834,28 @@ namespace 软件系统服务端模版 { net_udp_server = new Net_Udp_Server(); net_udp_server.LogHelper.LogSaveFileName = Application.StartupPath + @"\udp_log.txt";//日志路径 + net_udp_server.KeyToken = CommonHeadCode.KeyToken; net_udp_server.ReceiveCacheLength = 1024;//单次接收数据的缓冲长度 net_udp_server.AcceptByte += Net_udp_server_AcceptByte;//接收到字节数据的时候触发事件 net_udp_server.AcceptString += Net_udp_server_AcceptString;//接收到字符串数据的时候触发事件 net_udp_server.ServerStart(CommonLibrary.CommonLibrary.Port_Udp_Server); } - catch(Exception ex) + catch (Exception ex) { SoftBasic.ShowExceptionMessage(ex); } } - private void Net_udp_server_AcceptString(AsyncStateOne object1, string object2) + private void Net_udp_server_AcceptString(AsyncStateOne state, int customer, string data) { //此处为测试 Invoke(new Action(() => { - textBox1.AppendText($"{DateTime.Now.ToString("MM-dd HH:mm:ss ")}来自IP:{object1._IpEnd_Point.Address.ToString()} 内容:{object2}{Environment.NewLine}"); + textBox1.AppendText($"{DateTime.Now.ToString("MM-dd HH:mm:ss ")}来自IP:{state._IpEnd_Point.Address.ToString()} 内容:{data}{Environment.NewLine}"); })); } - private void Net_udp_server_AcceptByte(AsyncStateOne object1, byte[] object2) + private void Net_udp_server_AcceptByte(AsyncStateOne state, int customer, byte[] data) { //具体用法参考上面字符串方法 } diff --git a/软件系统服务端模版/软件系统服务端模版.csproj b/软件系统服务端模版/软件系统服务端模版.csproj index 26ec309..f9f58f2 100644 --- a/软件系统服务端模版/软件系统服务端模版.csproj +++ b/软件系统服务端模版/软件系统服务端模版.csproj @@ -35,7 +35,7 @@ ..\CommonLibrary\bin\Debug\CommonLibrary.dll - + False ..\Public\HslCommunication.dll