Files
ClientServerProject/软件系统服务端模版/FormServerWindow.cs

1027 lines
45 KiB
C#
Raw Normal View History

2017-02-22 14:30:10 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HslCommunication.Enthernet;
2017-02-22 14:30:10 +08:00
using System.Threading;
using CommonLibrary;
using Newtonsoft.Json.Linq;
using HslCommunication.BasicFramework;
2017-02-22 14:30:10 +08:00
/******************************************************************************************
*
* 2017-06-16
* Richard.Hu
* Richard.Hu
* 使hsl200909@163.com洽谈
* JSON组件引用自james newton-kingMIT授权协议
* Richard.Hu所有
*
********************************************************************************************/
2017-02-22 14:30:10 +08:00
/******************************************************************************************
*
*
* Form1_FormClosing(object sender, FormClosingEventArgs e)
2017-06-16 10:56:21 +08:00
* admin 123456
*
********************************************************************************************/
2017-02-22 14:30:10 +08:00
/******************************************************************************************
*
* .exe
* hsl200909@163.com获取
* .exe IP30使
*
********************************************************************************************/
2017-02-22 14:30:10 +08:00
namespace
{
2017-06-16 16:22:12 +08:00
public partial class FormServerWindow : Form
2017-02-22 14:30:10 +08:00
{
2017-06-16 16:22:12 +08:00
public FormServerWindow()
2017-02-22 14:30:10 +08:00
{
InitializeComponent();
//检测日志路径是否存储
LogSavePath = Application.StartupPath + @"\Logs";
if(!System.IO.Directory.Exists(LogSavePath))
{
System.IO.Directory.CreateDirectory(LogSavePath);
}
2017-02-22 14:30:10 +08:00
}
#region +
/// <summary>
/// 指示窗口是否处于显示中
/// </summary>
private bool IsWindowShow { get; set; } = false;
/// <summary>
/// 指示系统是否启动
/// </summary>
private bool IsSystemStart { get; set; } = false;
private string LogSavePath { get; set; }
2017-02-22 14:30:10 +08:00
private void Form1_Load(object sender, EventArgs e)
{
//初始化日志工具
RuntimeLogHelper = new SoftLogHelper()
{
LogSaveFileName = LogSavePath + @"\log.txt",
};
//初始化反馈信息工具
AdviceLogHelper = new SoftLogHelper()
{
LogSaveFileName = LogSavePath + @"\advice_log.txt",
};
2017-02-22 14:30:10 +08:00
//保存路径初始化
UserServer.ServerSettings.FileSavePath = Application.StartupPath + @"\settings.txt";
//加载参数
UserServer.ServerSettings.LoadByFile();
toolStripStatusLabel_version.Text = UserServer.ServerSettings.SystemVersion.ToString();
toolStripStatusLabel1.Text = $"本软件著作权归{Resource.StringResouce.SoftCopyRight}所有";
2017-06-16 16:22:12 +08:00
label5.Text = Resource.StringResouce.SoftName;
2017-02-22 14:30:10 +08:00
//加载账户信息
UserServer.ServerAccounts.FileSavePath = Application.StartupPath + @"\accounts.txt";
2017-02-22 14:30:10 +08:00
UserServer.ServerAccounts.LoadByFile();
UserServer.ServerAccounts.LogHelper = RuntimeLogHelper;
//初始化聊天信息
ChatInitialization();
2017-02-22 14:30:10 +08:00
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//密码验证的示例,此处关闭窗口验证
using (FormPasswordCheck fpc = new FormPasswordCheck("123456"))
2017-02-22 14:30:10 +08:00
{
if (fpc.ShowDialog() == DialogResult.OK)
{
IsWindowShow = false;
Thread.Sleep(20);
//关闭网络引擎
net_socket_server.ServerClose();
net_simplify_server.ServerClose();
net_udp_server.ServerClose();
}
else
{
//取消关闭
e.Cancel = true;
}
2017-02-22 14:30:10 +08:00
}
//紧急数据的保存已经放置到dispose方法中即时发生BUG或直接关机也能存储数据
}
private void Form1_Shown(object sender, EventArgs e)
{
IsWindowShow = true;
//维护初始化
2017-02-22 14:30:10 +08:00
MaintenanceInitialization();
//时间引擎初始化
TimeTickInitilization();
2017-02-22 14:30:10 +08:00
Refresh();
ToolStripMenuItem.PerformClick();
}
#endregion
#region
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!IsSystemStart)
{
Net_Simplify_Server_Initialization();//同步网络初始化
Net_Socket_Server_Initialization();//异步网络初始化
Net_SoftUpdate_Server_Initialization();//软件更新引擎初始化
Net_File_Update_Initialization();//软件异地更新引擎初始化
Simple_File_Initiaization();//共享文件引擎初始化
Net_Udp_Server_Initialization();//UDP引擎服务初始化
2017-02-22 14:30:10 +08:00
ToolStripMenuItem.Text = "已启动";
ToolStripMenuItem.BackColor = Color.LimeGreen;
IsSystemStart = true;
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
using (FormVersionControl fvc = new FormVersionControl(UserServer.ServerSettings))
{
fvc.ShowDialog();
toolStripStatusLabel_version.Text = UserServer.ServerSettings.SystemVersion.ToString();
}
2017-02-22 14:30:10 +08:00
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
using (FormMaintenance fm = new FormMaintenance(UserServer.ServerSettings))
{
fm.ShowDialog();
MaintenanceInitialization();
}
2017-02-22 14:30:10 +08:00
}
2017-02-22 14:30:10 +08:00
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
//测试发送字节数据
//net_socket_server.SendAllClients(BitConverter.GetBytes(12345678));
2017-02-22 14:30:10 +08:00
//将消息群发给所有的客户端,并使用消息弹窗的方式显示
using (FormInputAndAction fiaa = new FormInputAndAction(
m =>
{
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode., m); return true;
}))
{
fiaa.ShowDialog();
}
2017-02-22 14:30:10 +08:00
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
//关闭信号发送至所有在线客户端
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode., "");
2017-02-22 14:30:10 +08:00
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
using (FormAbout fm = new FormAbout(
Resource.StringResouce.SoftName, UserServer.ServerSettings.SystemVersion,
2017, Resource.StringResouce.SoftCopyRight))
{
fm.ShowDialog();
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
using (FormAuthorAdvertisement faa = new FormAuthorAdvertisement())
{
faa.ShowDialog();
}
2017-02-22 14:30:10 +08:00
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
//该部分比较复杂,需要对委托,匿名委托概念比较清晰
using (FormAccountManage fam = new FormAccountManage(() => UserServer.ServerAccounts.GetAllAccountsJson(),
m => { UserServer.ServerAccounts.LoadAllAccountsJson(m); return true; }))
{
fam.ShowDialog();
}
2017-02-22 14:30:10 +08:00
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
using (FormAboutVersion fav = new FormAboutVersion(UserServer.ServerSettings.SystemVersion))
{
fav.ShowDialog();
}
2017-02-22 14:30:10 +08:00
}
private void MaintenanceInitialization()
{
//维护状态变更
if (UserServer.ServerSettings.Can_Account_Login)
{
label3.Text = "可登录";
label3.BackColor = Color.LimeGreen;
}
else
{
label3.Text = "维护中";
label3.BackColor = Color.Tomato;
}
}
#endregion
#region
/// <summary>
/// 支持软件自动更新的后台服务引擎
/// </summary>
private Net_SoftUpdate_Server net_soft_update_Server = new Net_SoftUpdate_Server();
private void Net_SoftUpdate_Server_Initialization()
{
try
{
net_soft_update_Server.LogHelper.LogSaveFileName = LogSavePath + @"\update_log.txt";
2017-02-22 14:30:10 +08:00
//在服务器的这个路径下放置客户端运行的所有文件不要包含settings文件不要从此处运行
//只放置exe和dll组件必须放置软件自动更新.exe
net_soft_update_Server.KeyToken = CommonHeadCode.KeyToken;
net_soft_update_Server.FileUpdatePath = Application.StartupPath + @"\ClientFiles";//客户端文件路径
net_soft_update_Server.ServerStart(CommonLibrary.CommonLibrary.Port_Update_Net);
2017-02-22 14:30:10 +08:00
}
catch (Exception ex)
{
SoftBasic.ShowExceptionMessage(ex);
2017-02-22 14:30:10 +08:00
}
}
#endregion
#region
/// <summary>
/// 用于局域网异地更新服务器的客户端程序的引擎,仅限客户端
/// </summary>
private Net_File_Server net_file_update = new Net_File_Server();
/// <summary>
/// 软件异地更新的初始化,如不需要可以不启动,该功能支持发送客户端文件至服务器实现覆盖更新
2017-02-22 14:30:10 +08:00
/// </summary>
private void Net_File_Update_Initialization()
{
try
{
net_file_update.FilesPath = Application.StartupPath + @"\ClientFiles";//服务器客户端需要更新的路径,与上述一致
net_file_update.LogHelper.LogSaveFileName = LogSavePath + @"\update_file_log.txt";
net_file_update.KeyToken = CommonHeadCode.KeyToken;
net_file_update.ServerStart(CommonLibrary.CommonLibrary.Port_Update_Remote);
2017-02-22 14:30:10 +08:00
}
catch (Exception ex)
{
SoftBasic.ShowExceptionMessage(ex);
2017-02-22 14:30:10 +08:00
}
}
#endregion
#region
/// <summary>
/// 用户同步数据传送的引擎
/// </summary>
private Net_Simplify_Server net_simplify_server = new Net_Simplify_Server();
/// <summary>
/// 同步传送数据的初始化
/// </summary>
private void Net_Simplify_Server_Initialization()
{
try
{
net_simplify_server.KeyToken = CommonHeadCode.KeyToken;//设置身份令牌
net_simplify_server.LogHelper.LogSaveFileName = LogSavePath + @"\simplify_log.txt";//日志路径
net_simplify_server.ReceiveStringEvent += Net_simplify_server_ReceiveStringEvent;//接收到字符串触发
net_simplify_server.ReceivedBytesEvent += Net_simplify_server_ReceivedBytesEvent;//接收到字节触发
net_simplify_server.ServerStart(CommonLibrary.CommonLibrary.Port_Second_Net);
2017-02-22 14:30:10 +08:00
}
catch (Exception ex)
{
SoftBasic.ShowExceptionMessage(ex);
2017-02-22 14:30:10 +08:00
}
}
/// <summary>
/// 接收来自客户端的字节数据
/// </summary>
/// <param name="state">网络状态</param>
/// <param name="customer">字节数据,根据实际情况选择是否使用</param>
/// <param name="data">来自客户端的字节数据</param>
private void Net_simplify_server_ReceivedBytesEvent(AsyncStateOne state, int customer, byte[] data)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, data);
2017-02-22 14:30:10 +08:00
}
/******************************************************************************************************************
*
*
* SendMessage异常系统将会自动处理
*
******************************************************************************************************************/
2017-02-22 14:30:10 +08:00
/// <summary>
/// 接收到来自客户端的数据,此处需要放置维护验证,更新验证等等操作
/// </summary>
/// <param name="state">客户端的地址</param>
/// <param name="customer">用于自定义的指令头可不用转而使用data来区分</param>
/// <param name="data">接收到的服务器的数据</param>
private void Net_simplify_server_ReceiveStringEvent(AsyncStateOne state, int customer, string data)
2017-02-22 14:30:10 +08:00
{
//必须返回结果调用SendMessage(object1,[实际数据]);
if (CommonHeadCode.SimplifyHeadCode.IsCustomerGroupSystem(customer))
{
DataProcessingWithStartA(state, customer, data);
}
else if (CommonHeadCode.SimplifyHeadCode.IsCustomerGroupLogging(customer))
{
DataProcessingWithStartB(state, customer, data);
}
else
{
net_simplify_server.SendMessage(state, customer, data);
}
}
/****************************************************************************************************
*
*
*
*
*
****************************************************************************************************/
/// <summary>
/// A指令块处理系统基础运行的消息
/// </summary>
/// <param name="state">网络状态对象</param>
/// <param name="data">实际的数据</param>
private void DataProcessingWithStartA(AsyncStateOne state, int customer, string data)
{
if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, "1");
//UserServer.ServerSettings.Can_Account_Login ? "1" : "0" +
//UserServer.ServerSettings.Account_Forbidden_Reason);
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, UserServer.ServerSettings.SystemVersion.ToString());
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
JObject json = new JObject
{
{ nameof(UserServer.ServerSettings.Announcement), new JValue(UserServer.ServerSettings.Announcement) }
};
net_simplify_server.SendMessage(state, customer, json.ToString());
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
//此处使用的是组件自带的验证的方式如果使用SQL数据库另行验证
JObject json = JObject.Parse(data);
2017-02-22 14:30:10 +08:00
//提取账户,密码
string name = SoftBasic.GetValueFromJsonObject(json, UserAccount.UserNameText, "");
string password = SoftBasic.GetValueFromJsonObject(json, UserAccount.PasswordText, "");
net_simplify_server.SendMessage(state, customer, UserServer.ServerAccounts.CheckAccountJson(
name, password, state.GetRemoteEndPoint().Address.ToString()));
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
UserServer.ServerSettings.Announcement = data;
2017-02-22 14:30:10 +08:00
//通知所有客户端更新公告
net_socket_server.SendAllClients(customer, data);
net_simplify_server.SendMessage(state, customer, "成功");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
//返回服务器的账户信息
net_simplify_server.SendMessage(state, customer, UserServer.ServerAccounts.GetAllAccountsJson());
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
//更新服务器的账户信息
UserServer.ServerAccounts.LoadAllAccountsJson(data);
net_simplify_server.SendMessage(state, customer, "成功");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
//更新服务器的账户密码此处使用的是组件自带的验证的方式如果使用SQL数据库另行验证
JObject json = JObject.Parse(data);
2017-02-22 14:30:10 +08:00
//提取账户,密码
string name = SoftBasic.GetValueFromJsonObject(json, UserAccount.UserNameText, "");
string password = SoftBasic.GetValueFromJsonObject(json, UserAccount.PasswordText, "");
UserServer.ServerAccounts.UpdatePassword(name, password);
net_simplify_server.SendMessage(state, customer, "成功");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
try
{
UserServer.ServerSettings.SystemVersion = new SystemVersion(data);
UserServer.ServerSettings.SaveToFile();
toolStripStatusLabel_version.Text = UserServer.ServerSettings.SystemVersion.ToString();
2017-06-16 10:38:30 +08:00
//记录数据
2017-06-16 10:56:21 +08:00
RuntimeLogHelper.SaveInformation($"更改了版本号:{data}");
net_simplify_server.SendMessage(state, customer, "1");
}
catch
{
net_simplify_server.SendMessage(state, customer, "0");
}
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
bool result = UserServer.ServerAccounts.AddNewAccount(data);
net_simplify_server.SendMessage(state, customer, result ? "1" : "0");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_simplify_server.SendMessage(state, customer, net_simple_file_server.ToJsonString());
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
AdviceLogHelper.SaveInformation(data);
net_simplify_server.SendMessage(state, customer, "成功");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode., data);
net_simplify_server.SendMessage(state, customer, "成功");
}
else
{
net_simplify_server.SendMessage(state, customer, data);
}
}
/// <summary>
/// B指令块处理日志相关的消息
/// </summary>
/// <param name="state"></param>
/// <param name="customer">用户自定义的命令头</param>
/// <param name="data"></param>
private void DataProcessingWithStartB(AsyncStateOne state, int customer, string data)
{
if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, net_socket_server.LogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("网络日志查看");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_socket_server.LogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveWarnning("网络日志清空");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, net_simplify_server.LogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("同步日志查看");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.LogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveWarnning("同步日志清空");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_simplify_server.SendMessage(state, customer, net_soft_update_Server.LogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("更新日志查看");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
2017-02-22 14:30:10 +08:00
{
net_soft_update_Server.LogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveWarnning("更新日志清空");
2017-02-22 14:30:10 +08:00
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_simplify_server.SendMessage(state, customer, RuntimeLogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("运行日志查看");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
RuntimeLogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveInformation("运行日志清空");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_simplify_server.SendMessage(state, customer, net_simple_file_server.LogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("共享文件日志查看");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_simple_file_server.LogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveInformation("共享文件日志清空");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
net_simplify_server.SendMessage(state, customer, AdviceLogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("建议反馈日志查看");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.)
{
AdviceLogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveWarnning("建议反馈日志清空");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.UDP日志查看)
{
net_simplify_server.SendMessage(state, 0, net_udp_server.LogHelper.GetLogText());
RuntimeLogHelper.SaveInformation("UDP日志查看");
}
else if (customer == CommonHeadCode.SimplifyHeadCode.UDP日志清空)
{
net_udp_server.LogHelper.ClearLogText();
net_simplify_server.SendMessage(state, customer, "成功");
RuntimeLogHelper.SaveWarnning("UDP日志清空");
}
2017-02-22 14:30:10 +08:00
else
{
net_simplify_server.SendMessage(state, customer, data);
2017-02-22 14:30:10 +08:00
}
}
/****************************************************************************************************
*
*
*
*
*
****************************************************************************************************/
2017-02-22 14:30:10 +08:00
#endregion
#region
/// <summary>
/// 异步客户端管理引擎,维护所有的客户端在线情况,支持主动发数据到所有的客户端
/// </summary>
2017-02-22 14:30:10 +08:00
private Net_Socket_Server net_socket_server = new Net_Socket_Server();
/// <summary>
/// 异步传送数据的初始化
/// </summary>
private void Net_Socket_Server_Initialization()
{
try
{
net_socket_server.KeyToken = CommonHeadCode.KeyToken;//设置身份令牌
net_socket_server.LogHelper.LogSaveFileName = LogSavePath + @"\net_log.txt";
net_socket_server.FormatClientOnline = "#IP:{0} Name:{1}";//必须为#开头,具体格式可由自身需求确定
net_socket_server.IsSaveLogClientLineChange = true;//设置客户端上下线是否记录到日志
net_socket_server.ClientOnline += new HslCommunication.NetBase.IEDelegate<AsyncStateOne>(Net_socket_server_ClientOnline);//客户端上线触发
net_socket_server.ClientOffline += new HslCommunication.NetBase.IEDelegate<AsyncStateOne, string>(Net_socket_server_ClientOffline);//客户端下线触发,包括异常掉线
net_socket_server.AllClientsStatusChange += new HslCommunication.NetBase.IEDelegate<string>(Net_socket_server_AllClientsStatusChange);//客户端上下线变化时触发
net_socket_server.MessageAlerts += new HslCommunication.NetBase.IEDelegate<string>(Net_socket_server_MessageAlerts);//服务器产生提示消息触发
net_socket_server.AcceptByte += new HslCommunication.NetBase.IEDelegate<AsyncStateOne, int, byte[]>(Net_socket_server_AcceptByte);//服务器接收到字节数据触发
net_socket_server.AcceptString += new HslCommunication.NetBase.IEDelegate<AsyncStateOne, int, string>(Net_socket_server_AcceptString);//服务器接收到字符串数据触发
net_socket_server.ServerStart(CommonLibrary.CommonLibrary.Port_Main_Net);
2017-02-22 14:30:10 +08:00
}
catch (Exception ex)
{
SoftBasic.ShowExceptionMessage(ex);
2017-02-22 14:30:10 +08:00
}
}
/******************************************************************************************************************
*
*
*
*
*
******************************************************************************************************************/
private void Net_socket_server_AcceptString(AsyncStateOne object1, int customer, string data)
2017-02-22 14:30:10 +08:00
{
//如果此处充斥大量if语句影响观感则考虑进行指令头分类操作客户端异步发送的字符串都会到此处处理
if (CommonHeadCode.MultiNetHeadCode.IsCustomerGroupSystem(customer))
{
//H类系统指令
DataProcessingWithStartH(object1, customer, data);
}
}
/// <summary>
/// H开头的处理块
/// </summary>
/// <param name="state">网络状态</param>
/// <param name="headcode">用户自定义的指令头</param>
/// <param name="data">字符串数据</param>
private void DataProcessingWithStartH(AsyncStateOne state, int customer, string data)
{
if (customer == CommonHeadCode.MultiNetHeadCode.)
{
ChatAddMessage(state.LoginAlias, data);
}
2017-02-22 14:30:10 +08:00
}
private void Net_socket_server_AcceptByte(AsyncStateOne state, int customer, byte[] data)
2017-02-22 14:30:10 +08:00
{
//如果此处充斥大量if语句影响观感则考虑进行指令头分类操作客户端异步发送的字节数组都会到此处处理
}
private void Net_socket_server_MessageAlerts(string object1)
{
//同上的方法,此处处理数据时处于后台线程
if (IsWindowShow && IsHandleCreated)
{
BeginInvoke(new Action(() =>
{
textBox1.AppendText(object1 + Environment.NewLine);
}));
}
}
private void Net_socket_server_ClientOffline(AsyncStateOne object1, string object2)
2017-02-22 14:30:10 +08:00
{
Net_socket_clients_change(DateTime.Now.ToString("MM-dd HH:mm:ss ") + object1._IpEnd_Point.Address.ToString() + "" +
object1.LoginAlias + " " + object2);
2017-02-22 14:30:10 +08:00
}
private void Net_socket_server_ClientOnline(AsyncStateOne object1)
2017-02-22 14:30:10 +08:00
{
//上线后回发一条数据初始化信息
JObject json = new JObject
{
{ "Time", new JValue(DateTime.Now) },
{ "FileCount", new JValue(net_simple_file_server.File_Count()) },
{ "chats", new JValue(Chats_Managment.ToSaveString())}
};
//发送客户端的初始化数据
net_socket_server.Send(object1, CommonHeadCode.MultiNetHeadCode., json.ToString());
//触发上下线功能
2017-02-22 14:30:10 +08:00
Net_socket_clients_change(DateTime.Now.ToString("MM-dd HH:mm:ss ") + object1._IpEnd_Point.Address.ToString() + "" +
object1.LoginAlias + " 上线");
ChatAddMessage(object1.LoginAlias + " 上线");
2017-02-22 14:30:10 +08:00
}
private void Net_socket_clients_change(string str)
{
if (IsWindowShow && IsHandleCreated)
{
BeginInvoke(new Action(() =>
{
textBox1.AppendText(str + Environment.NewLine);
}));
}
}
private void Net_socket_server_AllClientsStatusChange(string data)
{
//此处决定要不要将在线客户端的数据发送所有客户端
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.线, data);
if (IsWindowShow && IsHandleCreated)
{
BeginInvoke(new Action(() =>
{
listBox1.DataSource = data.Split('#');
2017-02-22 14:30:10 +08:00
label4.Text = net_socket_server.ClientCount.ToString();
}));
}
}
2017-02-22 14:30:10 +08:00
#endregion
#region 线
2017-05-30 17:38:35 +08:00
/*********************************************************************************************
*
* 线西
*
*
********************************************************************************************/
/// <summary>
/// 初始化后台的计数线程
/// </summary>
public void TimeTickInitilization()
{
toolStripStatusLabel_time.Alignment = ToolStripItemAlignment.Right;
statusStrip1.LayoutStyle = ToolStripLayoutStyle.StackWithOverflow;
toolStripStatusLabel_time.ForeColor = Color.Purple;//紫色
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
2017-05-30 17:38:35 +08:00
{
toolStripStatusLabel_time.Text = DateTime.Now.ToString();
};
while (IsWindowShow)
{
while (DateTime.Now.Second == second)
{
Thread.Sleep(20);
}
second = DateTime.Now.Second;
if (IsWindowShow && IsHandleCreated) Invoke(DTimeShow);
//每秒钟执行的代码
if (second == 0)
{
//每个0秒执行的代码
//net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode.时间的推送, DateTime.Now.ToString("O"));
}
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
#region
/// <summary>
/// 共享文件服务器引擎
/// </summary>
private SimpleShareFileServer net_simple_file_server { get; set; } = null;
/// <summary>
/// 共享文件服务引擎初始化
/// </summary>
private void Simple_File_Initiaization()
{
try
{
net_simple_file_server = new SimpleShareFileServer()
{
//文件信息存储路径
FileSavePath = Application.StartupPath + @"\files.txt"
};
net_simple_file_server.ReadFromFile();
net_simple_file_server.LogHelper.LogSaveFileName = LogSavePath + @"\share_file_log.txt";
//文件存储路径
net_simple_file_server.File_save_path = Application.StartupPath + @"\Files";
net_simple_file_server.FileChange += Net_simple_file_server_FileChange;
net_simple_file_server.ServerStart(CommonLibrary.CommonLibrary.Port_Share_File);
}
2017-05-30 17:38:35 +08:00
catch (Exception ex)
{
SoftBasic.ShowExceptionMessage(ex);
}
}
private void Net_simple_file_server_FileChange()
{
//将文件数据发送给客户端
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode., net_simple_file_server.File_Count().ToString());
}
#endregion
#region
/**********************************************************************************************************
*
*
* AdviceLogHelper.SaveInformation("张三:主界面的颜色稍微调整一下");
*
**********************************************************************************************************/
/// <summary>
/// 用来记录一般的事物日志
/// </summary>
private SoftLogHelper AdviceLogHelper { get; set; }
#endregion
#region Udp网络通信块
/*********************************************************************************************************
*
2017-06-07 22:29:47 +08:00
* UDP服务引擎UserClient.Net_Udp_Client.SendMessage(data);
* FormMainWindow中的udp发送说明
* Udp引擎非常健壮
2017-06-07 22:29:47 +08:00
*
* ReceiveCacheLength = 10241000
* 访使
*
**********************************************************************************************************/
/// <summary>
/// 服务器的UDP核心引擎
/// </summary>
2017-06-07 21:20:24 +08:00
private Net_Udp_Server net_udp_server { get; set; }
private void Net_Udp_Server_Initialization()
{
try
{
2017-06-07 21:20:24 +08:00
net_udp_server = new Net_Udp_Server();
net_udp_server.LogHelper.LogSaveFileName = LogSavePath + @"\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)
{
SoftBasic.ShowExceptionMessage(ex);
}
}
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:{state._IpEnd_Point.Address.ToString()} 内容:{data}{Environment.NewLine}");
}));
}
private void Net_udp_server_AcceptByte(AsyncStateOne state, int customer, byte[] data)
{
//具体用法参考上面字符串方法
}
#endregion
#region 访PLC块示例代码
2017-05-18 18:32:45 +08:00
/*************************************************************************************************
*
* 访PLC数据的类使访100
*
*
*
*************************************************************************************************/
HslCommunication.Profinet.MelsecNetMultiAsync MelsecMulti { get; set; }
private void MelsecNetMultiInnitialization()
{
2017-05-22 21:08:37 +08:00
List<System.Net.IPAddress> IpEndPoints = new List<System.Net.IPAddress>();
2017-05-18 18:32:45 +08:00
//增加100台需要访问的三菱设备指定所有设备IP和端口注意顺序很重要
for (int i = 1; i < 100; i++)
{
2017-05-22 21:08:37 +08:00
IpEndPoints.Add(System.Net.IPAddress.Parse("192.168.10." + i));
2017-05-18 18:32:45 +08:00
}
2017-05-28 22:29:29 +08:00
//每隔1秒钟访问一次读取的地址为D6000-D6019超时时间为700毫秒主端口为6000备用端口为6001
2017-05-22 21:08:37 +08:00
MelsecMulti = new HslCommunication.Profinet.MelsecNetMultiAsync(0, 0, HslCommunication.Profinet.MelsecDataType.D, 6000, 20, 700, 1000, IpEndPoints.ToArray(), 6000, 6001);
MelsecMulti.OnReceivedData += MelsecMulti_OnReceivedData;//所有机台的数据都返回时触发
2017-05-18 18:32:45 +08:00
}
private void MelsecMulti_OnReceivedData(byte[] object1)
{
/*********************************************************************************************
*
* object1包含了所有机台读取到的数据
* D6000开始20个D
* 20*2+2=42byte1004200
* object1的0-41
* 0访0x00,0x01
*
********************************************************************************************/
for (int i = 0; i < 100; i++)
{
int startIndex = i * 42;
ushort netState = BitConverter.ToUInt16(object1, startIndex);//为0说明数据正常不为0说明网络访问失败或是指令出错
2017-05-18 18:32:45 +08:00
}
2017-05-18 18:32:45 +08:00
}
#endregion
#region
2017-05-18 18:32:45 +08:00
private SoftNumericalOrder OrderAutoCreate { get; set; }
/// <summary>
/// 流水号初始化方法如果需要可以放到窗口的load方法中
/// </summary>
private void OrderInitialization()
{
/*********************************************************************************************************
*
* 7
* 1 string str = OrderAutoCreate.GetNumericalOrder();//str为 AB201705190000001
* 2 string str = OrderAutoCreate.GetNumericalOrder("KN");//str为 KN201705190000002
* 12900亿亿OrderAutoCreate.ClearNumericalOrder();
* ThreadTimeTick()
* 100
*
**********************************************************************************************************/
OrderAutoCreate = new SoftNumericalOrder("AB", "yyyyMMdd", 7, Application.StartupPath + @"\order.txt");
}
#endregion
#region
private SoftMsgQueue<string> Chats_Managment { get; set; }
private void ChatInitialization()
{
Chats_Managment = new SoftMsgQueue<string>()
{
MaxCache = 200,//记录200条临时消息
FileSavePath = Application.StartupPath + @"\chats.txt"//设置保存的路径
};
Chats_Managment.LoadByFile();//加载以前的数据
}
private void ChatAddMessage(string user,string message)
{
string content = "\u0002" + user + DateTime.Now.ToString(" yyyy-MM-dd HH:mm:ss") + Environment.NewLine + " " + message;
//转发所有的客户端,包括发送者
net_socket_server.SendAllClients(CommonHeadCode.MultiNetHeadCode., content);
//添加缓存
Chats_Managment.AddNewItem(content);
}
/// <summary>
/// 如果需要发送一些系统自己的消息,请调用这个方法。
/// 一般来说将系统消息和用户聊天消息进行区分
/// </summary>
/// <param name="message">消息</param>
private void ChatAddMessage(string message)
{
ChatAddMessage("[系统]", message);
}
#endregion
2017-05-18 18:32:45 +08:00
/*********************************************************************************************************
*
* 使41. 2. 3. 4.
* [] RuntimeLogHelper.SaveInformation("等待存储的信息")
* 10000200K左右
* [\u0002]
*
**********************************************************************************************************/
2017-05-18 18:32:45 +08:00
/// <summary>
/// 用来记录一般的事物日志
/// </summary>
private SoftLogHelper RuntimeLogHelper { get; set; }
2017-02-22 14:30:10 +08:00
}
}