Browse Source

代码整理

dependabot/nuget/XCoderWpf/Microsoft.Data.SqlClient-4.0.5
大石头 3 years ago
parent
commit
33f0994eb7
  1. 6
      XCoder/Program.cs
  2. 2
      XCoder/Tools/FrmMain.cs
  3. 2
      XCoder/Tools/FrmSecurity.cs
  4. 8
      XCoder/Windows/FrmMain.cs
  5. 849
      XCoder/XApi/FrmMain.cs
  6. 46
      XCoder/XNet/BenchHelper.cs
  7. 213
      XCoder/XNet/FrmIp.cs
  8. 18
      XCoder/XNet/FrmMain.cs

6
XCoder/Program.cs

@ -3,9 +3,7 @@ using System.Text;
using NewLife;
using NewLife.Log;
using NewLife.Threading;
#if !NET4
using Stardust;
#endif
namespace XCoder;
@ -26,9 +24,7 @@ static class Program
#endif
MachineInfo.RegisterAsync();
#if !NET4
StartClient();
#endif
StringHelper.EnableSpeechTip = XConfig.Current.SpeechTip;
@ -39,7 +35,6 @@ static class Program
Application.Run(new FrmMDI());
}
#if !NET4
static TimerX _timer;
static StarClient _Client;
//static ServiceManager _Manager;
@ -135,5 +130,4 @@ static class Program
}
}
}
#endif
}

2
XCoder/Tools/FrmMain.cs

@ -24,10 +24,8 @@ namespace XCoder.Tools
}
private void btn_Include_Click(Object sender, EventArgs e)
{
#if !NET4
var frm = new FrmInclude();
ShowForm(frm);
#endif
}
private void btn_gps_Click(Object sender, EventArgs e)
{

2
XCoder/Tools/FrmSecurity.cs

@ -573,7 +573,6 @@ namespace XCoder.Tools
sb.AppendFormat("MachineGuid:\t{0}\t(SOFTWARE\\Microsoft\\Cryptography)\r\n", guid);
}
#if !NET4 && !__CORE__
sb.AppendLine();
var ci = new Microsoft.VisualBasic.Devices.ComputerInfo();
foreach (var pi in ci.GetType().GetProperties())
@ -581,7 +580,6 @@ namespace XCoder.Tools
//if (sb.Length > 0) sb.AppendLine();
sb.AppendFormat("{0}:\t{1:n0}\r\n", pi.Name, ci.GetValue(pi));
}
#endif
rtResult.Text = sb.Put(true);
}

8
XCoder/Windows/FrmMain.cs

@ -6,12 +6,8 @@ using CrazyCoder.Data;
using NewLife;
using NewLife.Log;
using NewLife.Reflection;
using NewLife.Threading;
using XCode.Code;
using XCode.DataAccessLayer;
#if !NET4
using TaskEx = System.Threading.Tasks.Task;
#endif
namespace XCoder
{
@ -121,7 +117,7 @@ namespace XCoder
//Engine = null;
// 断开的时候再取一次,确保下次能及时得到新的
TaskEx.Run(() => DAL.Create(Config.ConnName).Tables);
Task.Run(() => DAL.Create(Config.ConnName).Tables);
}
}
@ -154,7 +150,7 @@ namespace XCoder
void LoadTables()
{
TaskEx.Run(() =>
Task.Run(() =>
{
try
{

849
XCoder/XApi/FrmMain.cs

@ -1,12 +1,5 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using NewLife;
using NewLife.Data;
using NewLife.Log;
@ -17,530 +10,526 @@ using NewLife.Serialization;
using NewLife.Threading;
using NewLife.Windows;
using XCoder;
#if !NET4
using TaskEx = System.Threading.Tasks.Task;
#endif
namespace XApi
{
[Category("网络通信")]
[DisplayName("Api调试")]
public partial class FrmMain : Form, IXForm
{
ApiServer _Server;
ApiClient _Client;
namespace XApi;
/// <summary>业务日志输出</summary>
ILog BizLog;
[Category("网络通信")]
[DisplayName("Api调试")]
public partial class FrmMain : Form, IXForm
{
ApiServer _Server;
ApiClient _Client;
#region 窗体
public FrmMain()
{
InitializeComponent();
/// <summary>业务日志输出</summary>
ILog BizLog;
// 动态调节宽度高度,兼容高DPI
this.FixDpi();
#region 窗体
public FrmMain()
{
InitializeComponent();
//Font = new Font("宋体", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
//Icon = IcoHelper.GetIcon("Api");
}
// 动态调节宽度高度,兼容高DPI
this.FixDpi();
private void FrmMain_Load(Object sender, EventArgs e)
{
var log = TextFileLog.Create(null, "Api_{0:yyyy_MM_dd}.log");
BizLog = txtReceive.Combine(log);
txtReceive.UseWinFormControl();
//Font = new Font("宋体", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
//Icon = IcoHelper.GetIcon("Api");
}
txtReceive.SetDefaultStyle(12);
txtSend.SetDefaultStyle(12);
numMutilSend.SetDefaultStyle(12);
private void FrmMain_Load(Object sender, EventArgs e)
{
var log = TextFileLog.Create(null, "Api_{0:yyyy_MM_dd}.log");
BizLog = txtReceive.Combine(log);
txtReceive.UseWinFormControl();
gbReceive.Tag = gbReceive.Text;
gbSend.Tag = gbSend.Text;
txtReceive.SetDefaultStyle(12);
txtSend.SetDefaultStyle(12);
numMutilSend.SetDefaultStyle(12);
var cfg = ApiConfig.Current;
//cbMode.SelectedItem = cbMode.Items[0] + "";
cbMode.SelectedItem = cfg.Mode;
var flag = (cfg.Mode == "服务端");
numPort.Enabled = flag;
cbAddr.Enabled = !flag;
gbReceive.Tag = gbReceive.Text;
gbSend.Tag = gbSend.Text;
// 加载保存的颜色
UIConfig.Apply(txtReceive);
var cfg = ApiConfig.Current;
//cbMode.SelectedItem = cbMode.Items[0] + "";
cbMode.SelectedItem = cfg.Mode;
var flag = (cfg.Mode == "服务端");
numPort.Enabled = flag;
cbAddr.Enabled = !flag;
LoadConfig();
// 加载保存的颜色
UIConfig.Apply(txtReceive);
// 语音识别
ThreadPool.QueueUserWorkItem(s =>
{
var sp = SpeechRecognition.Current;
if (!sp.Enable) return;
LoadConfig();
sp.Register("打开", () => Invoke(Connect))
.Register("关闭", () => Invoke(Disconnect))
.Register("退出", () => Application.Exit())
.Register("发送", () => Invoke(() => btnSend_Click(null, null)));
// 语音识别
ThreadPool.QueueUserWorkItem(s =>
{
var sp = SpeechRecognition.Current;
if (!sp.Enable) return;
BizLog.Info("语音识别前缀:{0} 可用命令:{1}", sp.Name, sp.GetAllKeys().Join());
});
}
#endregion
sp.Register("打开", () => Invoke(Connect))
.Register("关闭", () => Invoke(Disconnect))
.Register("退出", () => Application.Exit())
.Register("发送", () => Invoke(() => btnSend_Click(null, null)));
#region 加载/保存 配置
void LoadConfig()
{
var cfg = ApiConfig.Current;
mi显示应用日志.Checked = cfg.ShowLog;
mi显示编码日志.Checked = cfg.ShowEncoderLog;
mi显示发送数据.Checked = cfg.ShowSend;
mi显示接收数据.Checked = cfg.ShowReceive;
mi显示统计信息.Checked = cfg.ShowStat;
cbMode.SelectedItem = cfg.Mode;
numPort.Value = cfg.Port;
// 历史地址列表
if (!cfg.Address.IsNullOrEmpty()) cbAddr.DataSource = cfg.Address.Split(";");
txtSend.Text = cfg.SendContent;
numMutilSend.Value = cfg.SendTimes;
numSleep.Value = cfg.SendSleep;
numThreads.Value = cfg.SendUsers;
mi日志着色.Checked = cfg.ColorLog;
}
BizLog.Info("语音识别前缀:{0} 可用命令:{1}", sp.Name, sp.GetAllKeys().Join());
});
}
#endregion
void SaveConfig()
{
var cfg = ApiConfig.Current;
cfg.ShowLog = mi显示应用日志.Checked;
cfg.ShowEncoderLog = mi显示编码日志.Checked;
cfg.ShowSend = mi显示发送数据.Checked;
cfg.ShowReceive = mi显示接收数据.Checked;
cfg.ShowStat = mi显示统计信息.Checked;
cfg.Mode = cbMode.SelectedItem + "";
cfg.Port = (Int32)numPort.Value;
cfg.AddAddress(cbAddr.Text);
cfg.SendContent = txtSend.Text;
cfg.SendTimes = (Int32)numMutilSend.Value;
cfg.SendSleep = (Int32)numSleep.Value;
cfg.SendUsers = (Int32)numThreads.Value;
cfg.ColorLog = mi日志着色.Checked;
cfg.Save();
}
#endregion
#region 加载/保存 配置
void LoadConfig()
{
var cfg = ApiConfig.Current;
mi显示应用日志.Checked = cfg.ShowLog;
mi显示编码日志.Checked = cfg.ShowEncoderLog;
mi显示发送数据.Checked = cfg.ShowSend;
mi显示接收数据.Checked = cfg.ShowReceive;
mi显示统计信息.Checked = cfg.ShowStat;
cbMode.SelectedItem = cfg.Mode;
numPort.Value = cfg.Port;
// 历史地址列表
if (!cfg.Address.IsNullOrEmpty()) cbAddr.DataSource = cfg.Address.Split(";");
txtSend.Text = cfg.SendContent;
numMutilSend.Value = cfg.SendTimes;
numSleep.Value = cfg.SendSleep;
numThreads.Value = cfg.SendUsers;
mi日志着色.Checked = cfg.ColorLog;
}
#region 收发数据
void Connect()
{
_Server = null;
_Client = null;
void SaveConfig()
{
var cfg = ApiConfig.Current;
cfg.ShowLog = mi显示应用日志.Checked;
cfg.ShowEncoderLog = mi显示编码日志.Checked;
cfg.ShowSend = mi显示发送数据.Checked;
cfg.ShowReceive = mi显示接收数据.Checked;
cfg.ShowStat = mi显示统计信息.Checked;
cfg.Mode = cbMode.SelectedItem + "";
cfg.Port = (Int32)numPort.Value;
cfg.AddAddress(cbAddr.Text);
cfg.SendContent = txtSend.Text;
cfg.SendTimes = (Int32)numMutilSend.Value;
cfg.SendSleep = (Int32)numSleep.Value;
cfg.SendUsers = (Int32)numThreads.Value;
cfg.ColorLog = mi日志着色.Checked;
cfg.Save();
}
#endregion
var port = (Int32)numPort.Value;
var uri = new NetUri(cbAddr.Text);
#region 收发数据
void Connect()
{
_Server = null;
_Client = null;
var cfg = ApiConfig.Current;
var log = BizLog;
var port = (Int32)numPort.Value;
var uri = new NetUri(cbAddr.Text);
switch (cbMode.Text)
{
case "服务端":
var svr = new ApiServer(port)
{
Log = cfg.ShowLog ? log : Logger.Null,
EncoderLog = cfg.ShowEncoderLog ? log : Logger.Null
};
var cfg = ApiConfig.Current;
var log = BizLog;
if (cfg.ShowSend || cfg.ShowReceive)
{
svr.EnsureCreate();
var ns = svr.Server as NetServer;
ns.Log = log;
ns.LogSend = cfg.ShowSend;
ns.LogReceive = cfg.ShowReceive;
}
switch (cbMode.Text)
{
case "服务端":
var svr = new ApiServer(port)
{
Log = cfg.ShowLog ? log : Logger.Null,
EncoderLog = cfg.ShowEncoderLog ? log : Logger.Null
};
svr.Register<MyApiController>();
svr.Start();
if (cfg.ShowSend || cfg.ShowReceive)
{
svr.EnsureCreate();
var ns = svr.Server as NetServer;
ns.Log = log;
ns.LogSend = cfg.ShowSend;
ns.LogReceive = cfg.ShowReceive;
}
$"正在监听{port}".SpeechTip();
svr.Register<MyApiController>();
svr.Start();
_Server = svr;
break;
case "客户端":
var client = new ApiClient(uri + "")
{
Log = cfg.ShowLog ? log : Logger.Null,
EncoderLog = cfg.ShowEncoderLog ? log : Logger.Null
};
$"正在监听{port}".SpeechTip();
//if (cfg.ShowSend || cfg.ShowReceive)
//{
// var ct = client.Client;
// ct.Log = log;
// ct.LogSend = cfg.ShowSend;
// ct.LogReceive = cfg.ShowReceive;
//}
_Server = svr;
break;
case "客户端":
var client = new ApiClient(uri + "")
{
Log = cfg.ShowLog ? log : Logger.Null,
EncoderLog = cfg.ShowEncoderLog ? log : Logger.Null
};
//if (cfg.ShowSend || cfg.ShowReceive)
//{
// var ct = client.Client;
// ct.Log = log;
// ct.LogSend = cfg.ShowSend;
// ct.LogReceive = cfg.ShowReceive;
//}
_Client = client;
client.Open();
// 连接成功后拉取Api列表
GetApiAll();
"已连接服务器".SpeechTip();
break;
default:
return;
}
_Client = client;
client.Open();
// 连接成功后拉取Api列表
GetApiAll();
pnlSetting.Enabled = false;
btnConnect.Text = "关闭";
"已连接服务器".SpeechTip();
// 添加地址
var addr = uri.ToString();
var list = cfg.Address.Split(";").ToList();
if (!list.Contains(addr))
{
list.Insert(0, addr);
cfg.Address = list.Join(";");
}
break;
default:
return;
}
cfg.Save();
pnlSetting.Enabled = false;
btnConnect.Text = "关闭";
_timer = new TimerX(ShowStat, null, 5000, 5000) { Async = true };
}
// 添加地址
var addr = uri.ToString();
var list = cfg.Address.Split(";").ToList();
if (!list.Contains(addr))
async void GetApiAll()
{
var apis = await _Client.InvokeAsync<String[]>("Api/All");
if (apis != null) Invoke(() =>
{
cbAction.Items.Clear();
foreach (var item in apis)
{
list.Insert(0, addr);
cfg.Address = list.Join(";");
cbAction.Items.Add(item);
}
cbAction.SelectedIndex = 0;
cbAction.Visible = true;
});
}
cfg.Save();
void Disconnect()
{
if (_Client != null)
{
_Client.Dispose();
_Client = null;
_timer = new TimerX(ShowStat, null, 5000, 5000) { Async = true };
"关闭连接".SpeechTip();
}
async void GetApiAll()
if (_Server != null)
{
var apis = await _Client.InvokeAsync<String[]>("Api/All");
if (apis != null) Invoke(() =>
{
cbAction.Items.Clear();
foreach (var item in apis)
{
cbAction.Items.Add(item);
}
cbAction.SelectedIndex = 0;
cbAction.Visible = true;
});
"停止服务".SpeechTip();
_Server.Dispose();
_Server = null;
}
void Disconnect()
if (_timer != null)
{
if (_Client != null)
{
_Client.Dispose();
_Client = null;
"关闭连接".SpeechTip();
}
if (_Server != null)
{
"停止服务".SpeechTip();
_Server.Dispose();
_Server = null;
}
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
pnlSetting.Enabled = true;
btnConnect.Text = "打开";
_timer.Dispose();
_timer = null;
}
TimerX _timer;
String _lastStat;
void ShowStat(Object state)
{
if (!ApiConfig.Current.ShowStat) return;
pnlSetting.Enabled = true;
btnConnect.Text = "打开";
}
var msg = "";
//if (_Client != null)
// msg = _Client.GetStat();
//else if (_Server != null)
// msg = _Server.GetStat();
TimerX _timer;
String _lastStat;
void ShowStat(Object state)
{
if (!ApiConfig.Current.ShowStat) return;
if (_Invoke > 0)
{
var ms = (Double)_Cost / _Invoke / 1000;
if (ms > 1)
msg += $" Invoke={_Invoke} {ms:n0}ms";
else
msg += $" Invoke={_Invoke} {ms:n3}ms";
var msg = "";
//if (_Client != null)
// msg = _Client.GetStat();
//else if (_Server != null)
// msg = _Server.GetStat();
if (_TotalCost > 0) msg += $" Speed={_Invoke * 1000d / _TotalCost:n0}tps";
}
if (_Invoke > 0)
{
var ms = (Double)_Cost / _Invoke / 1000;
if (ms > 1)
msg += $" Invoke={_Invoke} {ms:n0}ms";
else
msg += $" Invoke={_Invoke} {ms:n3}ms";
if (!msg.IsNullOrEmpty() && msg != _lastStat)
{
_lastStat = msg;
BizLog.Info(msg);
}
if (_TotalCost > 0) msg += $" Speed={_Invoke * 1000d / _TotalCost:n0}tps";
}
private void btnConnect_Click(Object sender, EventArgs e)
if (!msg.IsNullOrEmpty() && msg != _lastStat)
{
SaveConfig();
var btn = sender as Button;
if (btn.Text == "打开")
Connect();
else
Disconnect();
_lastStat = msg;
BizLog.Info(msg);
}
}
Int32 _pColor = 0;
Int32 BytesOfReceived = 0;
Int32 BytesOfSent = 0;
Int32 lastReceive = 0;
Int32 lastSend = 0;
private void timer1_Tick(Object sender, EventArgs e)
{
//if (!pnlSetting.Enabled)
{
var rcount = BytesOfReceived;
var tcount = BytesOfSent;
if (rcount != lastReceive)
{
gbReceive.Text = (gbReceive.Tag + "").Replace("0", rcount + "");
lastReceive = rcount;
}
if (tcount != lastSend)
{
gbSend.Text = (gbSend.Tag + "").Replace("0", tcount + "");
lastSend = tcount;
}
private void btnConnect_Click(Object sender, EventArgs e)
{
SaveConfig();
var set = ApiConfig.Current;
if (set.ColorLog) txtReceive.ColourDefault(_pColor);
_pColor = txtReceive.TextLength;
}
}
var btn = sender as Button;
if (btn.Text == "打开")
Connect();
else
Disconnect();
}
private async void btnSend_Click(Object sender, EventArgs e)
Int32 _pColor = 0;
Int32 BytesOfReceived = 0;
Int32 BytesOfSent = 0;
Int32 lastReceive = 0;
Int32 lastSend = 0;
private void timer1_Tick(Object sender, EventArgs e)
{
//if (!pnlSetting.Enabled)
{
var str = txtSend.Text;
if (String.IsNullOrEmpty(str))
var rcount = BytesOfReceived;
var tcount = BytesOfSent;
if (rcount != lastReceive)
{
MessageBox.Show("发送内容不能为空!", Text);
txtSend.Focus();
return;
gbReceive.Text = (gbReceive.Tag + "").Replace("0", rcount + "");
lastReceive = rcount;
}
if (tcount != lastSend)
{
gbSend.Text = (gbSend.Tag + "").Replace("0", tcount + "");
lastSend = tcount;
}
// 多次发送
var count = (Int32)numMutilSend.Value;
var sleep = (Int32)numSleep.Value;
var ths = (Int32)numThreads.Value;
if (count <= 0) count = 1;
if (sleep <= 0) sleep = 1;
var set = ApiConfig.Current;
if (set.ColorLog) txtReceive.ColourDefault(_pColor);
_pColor = txtReceive.TextLength;
}
}
SaveConfig();
private async void btnSend_Click(Object sender, EventArgs e)
{
var str = txtSend.Text;
if (String.IsNullOrEmpty(str))
{
MessageBox.Show("发送内容不能为空!", Text);
txtSend.Focus();
return;
}
var uri = new NetUri(cbAddr.Text);
var cfg = ApiConfig.Current;
// 多次发送
var count = (Int32)numMutilSend.Value;
var sleep = (Int32)numSleep.Value;
var ths = (Int32)numThreads.Value;
if (count <= 0) count = 1;
if (sleep <= 0) sleep = 1;
// 处理换行
str = str.Replace("\n", "\r\n");
SaveConfig();
var act = cbAction.SelectedItem + "";
var action = act.Substring(" ", "(");
if (action.IsNullOrEmpty()) return;
var uri = new NetUri(cbAddr.Text);
var cfg = ApiConfig.Current;
var rtype = act.Substring(null, " ").GetTypeEx();
if (rtype == null) rtype = typeof(Object);
var ps = act.Substring("(", ")").Split(",");
// 处理换行
str = str.Replace("\n", "\r\n");
// 构造消息,二进制优先
Object args = null;
if (ps.Length == 1 && ps[0].StartsWith("Packet "))
{
args = new Packet(str.GetBytes());
}
else
{
var dic = new JsonParser(str).Decode() as IDictionary<String, Object>;
if (dic == null || dic.Count == 0) dic = null;
args = dic;
}
var act = cbAction.SelectedItem + "";
var action = act.Substring(" ", "(");
if (action.IsNullOrEmpty()) return;
if (_Client == null) return;
var rtype = act.Substring(null, " ").GetTypeEx();
if (rtype == null) rtype = typeof(Object);
var ps = act.Substring("(", ")").Split(",");
_Invoke = 0;
_Cost = 0;
_TotalCost = 0;
// 构造消息,二进制优先
Object args = null;
if (ps.Length == 1 && ps[0].StartsWith("Packet "))
{
args = new Packet(str.GetBytes());
}
else
{
var dic = new JsonParser(str).Decode() as IDictionary<String, Object>;
if (dic == null || dic.Count == 0) dic = null;
args = dic;
}
//var ct = _Client.Client;
var list = new List<ApiClient> { _Client };
for (var i = 0; i < ths - 1; i++)
{
var client = new ApiClient(uri + "");
//var ct2 = client.Client;
//ct2.Log = ct.Log;
//ct2.LogSend = ct.LogSend;
//ct2.LogReceive = ct.LogReceive;
//ct2.StatSend = ct.StatSend;
//ct2.StatReceive = ct.StatReceive;
//client.StatSend = _Client.StatSend;
//client.StatReceive = _Client.StatReceive;
list.Add(client);
}
//Parallel.ForEach(list, k => OnSend(k, act, args, count));
var sw = Stopwatch.StartNew();
var ts = list.Select(k => OnSend(k, rtype, action, args, count, sleep)).ToList();
if (_Client == null) return;
await TaskEx.WhenAll(ts);
sw.Stop();
_TotalCost = sw.Elapsed.TotalMilliseconds;
}
_Invoke = 0;
_Cost = 0;
_TotalCost = 0;
Int64 _Invoke;
Int64 _Cost;
Double _TotalCost;
private async Task OnSend(ApiClient client, Type rtype, String act, Object args, Int32 count, Int32 sleep)
//var ct = _Client.Client;
var list = new List<ApiClient> { _Client };
for (var i = 0; i < ths - 1; i++)
{
client.Open();
var client = new ApiClient(uri + "");
//var ct2 = client.Client;
//ct2.Log = ct.Log;
//ct2.LogSend = ct.LogSend;
//ct2.LogReceive = ct.LogReceive;
//ct2.StatSend = ct.StatSend;
//ct2.StatReceive = ct.StatReceive;
//client.StatSend = _Client.StatSend;
//client.StatReceive = _Client.StatReceive;
list.Add(client);
}
//Parallel.ForEach(list, k => OnSend(k, act, args, count));
var sw = Stopwatch.StartNew();
var ts = list.Select(k => OnSend(k, rtype, action, args, count, sleep)).ToList();
await Task.WhenAll(ts);
sw.Stop();
_TotalCost = sw.Elapsed.TotalMilliseconds;
}
Int64 _Invoke;
Int64 _Cost;
Double _TotalCost;
private async Task OnSend(ApiClient client, Type rtype, String act, Object args, Int32 count, Int32 sleep)
{
client.Open();
// 间隔1开启同步发送不等待
if (sleep == 1)
// 间隔1开启同步发送不等待
if (sleep == 1)
{
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
try
{
try
{
Interlocked.Increment(ref _Invoke);
Interlocked.Increment(ref _Invoke);
client.Invoke(act, args);
}
catch (ApiException ex)
{
BizLog.Info(ex.Message);
}
client.Invoke(act, args);
}
sw.Stop();
Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
}
// 间隔2~10多任务异步发送
else if (sleep <= 10)
{
var ts = new List<Task>();
for (var i = 0; i < count; i++)
catch (ApiException ex)
{
ts.Add(TaskEx.Run(async () =>
{
try
{
//var sw = Stopwatch.StartNew();
await client.InvokeAsync<Object>(act, args);
//sw.Stop();
Interlocked.Increment(ref _Invoke);
//Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
}
catch (ApiException ex)
{
BizLog.Info(ex.Message);
}
}));
BizLog.Info(ex.Message);
}
await TaskEx.WhenAll(ts);
}
// 间隔>10单任务异步发送
else
sw.Stop();
Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
}
// 间隔2~10多任务异步发送
else if (sleep <= 10)
{
var ts = new List<Task>();
for (var i = 0; i < count; i++)
{
for (var i = 0; i < count; i++)
ts.Add(Task.Run(async () =>
{
try
{
var sw = Stopwatch.StartNew();
//var sw = Stopwatch.StartNew();
await client.InvokeAsync<Object>(act, args);
sw.Stop();
//sw.Stop();
Interlocked.Increment(ref _Invoke);
Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
//Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
}
catch (ApiException ex)
{
BizLog.Info(ex.Message);
}
await TaskEx.Delay(sleep);
}
}));
}
}
#endregion
#region 右键菜单
private void mi清空_Click(Object sender, EventArgs e)
{
txtReceive.Clear();
BytesOfReceived = 0;
await Task.WhenAll(ts);
}
private void mi清空2_Click(Object sender, EventArgs e)
// 间隔>10单任务异步发送
else
{
txtSend.Clear();
BytesOfSent = 0;
}
for (var i = 0; i < count; i++)
{
try
{
var sw = Stopwatch.StartNew();
await client.InvokeAsync<Object>(act, args);
sw.Stop();
private void miCheck_Click(Object sender, EventArgs e)
{
var mi = sender as ToolStripMenuItem;
mi.Checked = !mi.Checked;
Interlocked.Increment(ref _Invoke);
Interlocked.Add(ref _Cost, (Int64)(sw.Elapsed.TotalMilliseconds * 1000));
}
catch (ApiException ex)
{
BizLog.Info(ex.Message);
}
await Task.Delay(sleep);
}
}
#endregion
}
#endregion
private void cbAction_SelectedIndexChanged(Object sender, EventArgs e)
{
if (!(sender is ComboBox cb)) return;
#region 右键菜单
private void mi清空_Click(Object sender, EventArgs e)
{
txtReceive.Clear();
BytesOfReceived = 0;
}
var txt = cb.SelectedItem + "";
if (txt.IsNullOrEmpty()) return;
private void mi清空2_Click(Object sender, EventArgs e)
{
txtSend.Clear();
BytesOfSent = 0;
}
var set = ApiConfig.Current;
private void miCheck_Click(Object sender, EventArgs e)
{
var mi = sender as ToolStripMenuItem;
mi.Checked = !mi.Checked;
}
#endregion
// 截取参数部分
//!! netcore3.0中新增Split(String? separator, StringSplitOptions options = StringSplitOptions.None),优先于StringHelper扩展
var pis = txt.Substring("(", ")").Split(",");
private void cbAction_SelectedIndexChanged(Object sender, EventArgs e)
{
if (!(sender is ComboBox cb)) return;
// 生成参数
var ps = new Dictionary<String, Object>();
foreach (var item in pis)
{
var ss = item.Split(" ");
if (ss == null || ss.Length < 2) continue;
var txt = cb.SelectedItem + "";
if (txt.IsNullOrEmpty()) return;
Object val = null;
switch (ss[0])
{
case "String":
val = "";
break;
case "Int32":
val = 0;
break;
default:
break;
}
ps[ss[1]] = val;
}
var set = ApiConfig.Current;
txtSend.Text = ps.ToJson();
}
// 截取参数部分
//!! netcore3.0中新增Split(String? separator, StringSplitOptions options = StringSplitOptions.None),优先于StringHelper扩展
var pis = txt.Substring("(", ")").Split(",");
private void cbMode_SelectedIndexChanged(Object sender, EventArgs e)
// 生成参数
var ps = new Dictionary<String, Object>();
foreach (var item in pis)
{
var mode = cbMode.SelectedItem + "";
var flag = mode == "服务端";
numPort.Enabled = flag;
cbAddr.Enabled = !flag;
var ss = item.Split(" ");
if (ss == null || ss.Length < 2) continue;
Object val = null;
switch (ss[0])
{
case "String":
val = "";
break;
case "Int32":
val = 0;
break;
default:
break;
}
ps[ss[1]] = val;
}
txtSend.Text = ps.ToJson();
}
private void cbMode_SelectedIndexChanged(Object sender, EventArgs e)
{
var mode = cbMode.SelectedItem + "";
var flag = mode == "服务端";
numPort.Enabled = flag;
cbAddr.Enabled = !flag;
}
}

46
XCoder/XNet/BenchHelper.cs

@ -1,38 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewLife.Data;
using NewLife.Data;
using NewLife.Net;
using NewLife.Threading;
#if !NET4
using TaskEx = System.Threading.Tasks.Task;
#endif
namespace XCoder.XNet
namespace XCoder.XNet;
static class BenchHelper
{
static class BenchHelper
/// <summary>异步多次发送数据</summary>
/// <param name="session">会话</param>
/// <param name="pk">数据包</param>
/// <param name="times">次数</param>
/// <param name="msInterval">间隔</param>
/// <returns></returns>
public static Task SendConcurrency(this ISocketRemote session, Packet pk, Int32 times, Int32 msInterval)
{
/// <summary>异步多次发送数据</summary>
/// <param name="session">会话</param>
/// <param name="pk">数据包</param>
/// <param name="times">次数</param>
/// <param name="msInterval">间隔</param>
/// <returns></returns>
public static Task SendConcurrency(this ISocketRemote session, Packet pk, Int32 times, Int32 msInterval)
var task = Task.Run(async () =>
{
var task = TaskEx.Run(async () =>
for (var i = 0; i < times; i++)
{
for (var i = 0; i < times; i++)
{
session.Send(pk);
session.Send(pk);
await TaskEx.Delay(msInterval);
}
});
await Task.Delay(msInterval);
}
});
return task;
}
return task;
}
}

213
XCoder/XNet/FrmIp.cs

@ -1,150 +1,143 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.ComponentModel;
using System.Net;
using System.Net.NetworkInformation;
using System.Windows.Forms;
using NewLife;
using NewLife.Log;
using XCoder;
#if !NET4
#endif
namespace XNet
namespace XNet;
[Category("网络通信")]
[DisplayName("IP设置")]
public partial class FrmIp : Form, IXForm
{
[Category("网络通信")]
[DisplayName("IP设置")]
public partial class FrmIp : Form, IXForm
#region 窗体
public FrmIp()
{
#region 窗体
public FrmIp()
{
InitializeComponent();
InitializeComponent();
// 动态调节宽度高度,兼容高DPI
this.FixDpi();
// 动态调节宽度高度,兼容高DPI
this.FixDpi();
//Icon = IcoHelper.GetIcon("IP");
}
//Icon = IcoHelper.GetIcon("IP");
}
private void FrmMain_Load(Object sender, EventArgs e)
{
var ns = NetworkInterface.GetAllNetworkInterfaces();
cbAdapter.Tag = ns;
cbAdapter.DataSource = ns.Select(e => e.Name).ToArray();
}
#endregion
private void FrmMain_Load(Object sender, EventArgs e)
{
var ns = NetworkInterface.GetAllNetworkInterfaces();
cbAdapter.Tag = ns;
cbAdapter.DataSource = ns.Select(e => e.Name).ToArray();
}
#endregion
private void cbMode_SelectedIndexChanged(Object sender, EventArgs e)
{
var name = cbAdapter.SelectedItem + "";
if (name.IsNullOrEmpty()) return;
private void cbMode_SelectedIndexChanged(Object sender, EventArgs e)
{
var name = cbAdapter.SelectedItem + "";
if (name.IsNullOrEmpty()) return;
var ns = cbAdapter.Tag as NetworkInterface[];
var ni = ns.FirstOrDefault(e => e.Name == name);
if (ni == null) return;
var ns = cbAdapter.Tag as NetworkInterface[];
var ni = ns.FirstOrDefault(e => e.Name == name);
if (ni == null) return;
gbInfo.Tag = ni;
gbInfo.Text = ni.Description;
gbInfo.Tag = ni;
gbInfo.Text = ni.Description;
var ps = ni.GetIPProperties();
var ips = ps.UnicastAddresses.Where(e => e.Address.IsIPv4()).ToArray();
if (ips.Length == 0) return;
var ps = ni.GetIPProperties();
var ips = ps.UnicastAddresses.Where(e => e.Address.IsIPv4()).ToArray();
if (ips.Length == 0) return;
txtIp.Text = ips[0].Address + "";
txtSubMark.Text = ips[0].IPv4Mask + "";
txtGateway.Text = ps.GatewayAddresses.Where(e => e.Address.IsIPv4()).Join(",", e => e.Address);
txtDns.Text = ps.DnsAddresses.Where(e => e.IsIPv4()).Join();
txtIp.Text = ips[0].Address + "";
txtSubMark.Text = ips[0].IPv4Mask + "";
txtGateway.Text = ps.GatewayAddresses.Where(e => e.Address.IsIPv4()).Join(",", e => e.Address);
txtDns.Text = ps.DnsAddresses.Where(e => e.IsIPv4()).Join();
var ips2 = ips.Skip(1).OrderBy(e => e.Address.GetAddressBytes().ToLong()).Select(e => e.Address).ToArray();
txtIp2.Text = ips2.Join("\r\n");
}
var ips2 = ips.Skip(1).OrderBy(e => e.Address.GetAddressBytes().ToLong()).Select(e => e.Address).ToArray();
txtIp2.Text = ips2.Join("\r\n");
}
private void btnSet_Click(Object sender, EventArgs e)
{
var ni = gbInfo.Tag as NetworkInterface;
if (ni == null) return;
private void btnSet_Click(Object sender, EventArgs e)
{
var ni = gbInfo.Tag as NetworkInterface;
if (ni == null) return;
var ip = txtIp.Text?.Trim();
var mark = txtSubMark.Text?.Trim();
var gateway = txtGateway.Text?.Trim();
if (ip.IsNullOrEmpty() || mark.IsNullOrEmpty()) return;
var ip = txtIp.Text?.Trim();
var mark = txtSubMark.Text?.Trim();
var gateway = txtGateway.Text?.Trim();
if (ip.IsNullOrEmpty() || mark.IsNullOrEmpty()) return;
// 设置主IP
var args = $"interface ip add address name=\"{ni.Name}\" {ip} {mark} {gateway}";
var rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
// 设置主IP
var args = $"interface ip add address name=\"{ni.Name}\" {ip} {mark} {gateway}";
var rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
// 设置DNS
var dns = txtDns.Text.Split(",");
if (dns.Length > 0)
{
args = $"interface ip set dns name=\"{ni.Name}\" source=static addr={dns[0]} register=primary";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
if (dns.Length > 1)
{
args = $"interface ip add dnsservers name=\"{ni.Name}\" addr={dns[1]} index=2";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
}
}
else
// 设置DNS
var dns = txtDns.Text.Split(",");
if (dns.Length > 0)
{
args = $"interface ip set dns name=\"{ni.Name}\" source=static addr={dns[0]} register=primary";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
if (dns.Length > 1)
{
args = $"interface ip set dns name=\"{ni.Name}\" source=dhcp";
args = $"interface ip add dnsservers name=\"{ni.Name}\" addr={dns[1]} index=2";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
}
}
else
{
args = $"interface ip set dns name=\"{ni.Name}\" source=dhcp";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
}
// 解析私有IP,特殊格式如 10.0.0.30-50
var ips = txtIp2.Text.Split("\r", "\n", "\t", ",", " ").ToList();
// 倒序,要拆分插入末尾
for (var i = ips.Count - 1; i >= 0; i--)
// 解析私有IP,特殊格式如 10.0.0.30-50
var ips = txtIp2.Text.Split("\r", "\n", "\t", ",", " ").ToList();
// 倒序,要拆分插入末尾
for (var i = ips.Count - 1; i >= 0; i--)
{
ip = ips[i];
var p = ip.LastIndexOf('-');
if (p > 0)
{
ip = ips[i];
var p = ip.LastIndexOf('-');
if (p > 0)
var p2 = ip.LastIndexOf('.');
if (p2 > 0)
{
var p2 = ip.LastIndexOf('.');
if (p2 > 0)
// 删掉这一行,因为要拆分为多行
ips.RemoveAt(i);
// 解析前缀、开始、结束
var prefix = ip.Substring(0, p2 + 1);
var start = ip.Substring(p2 + 1, p - p2 - 1).ToInt();
var end = ip.Substring(p + 1).ToInt();
for (var k = start; k <= end; k++)
{
// 删掉这一行,因为要拆分为多行
ips.RemoveAt(i);
// 解析前缀、开始、结束
var prefix = ip.Substring(0, p2 + 1);
var start = ip.Substring(p2 + 1, p - p2 - 1).ToInt();
var end = ip.Substring(p + 1).ToInt();
for (var k = start; k <= end; k++)
{
ips.Add($"{prefix}{k}");
}
ips.Add($"{prefix}{k}");
}
}
}
// 设置私有IP,排序
var addrs = ips.Select(e => IPAddress.Parse(e)).OrderBy(e => e.GetAddressBytes().ToLong()).ToArray();
foreach (var item in addrs)
{
args = $"interface ip add address name=\"{ni.Name}\" {item} {mark} {gateway}";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
}
MessageBox.Show($"执行成功!返回 {rs}");
}
private void btnRestore_Click(Object sender, EventArgs e)
// 设置私有IP,排序
var addrs = ips.Select(e => IPAddress.Parse(e)).OrderBy(e => e.GetAddressBytes().ToLong()).ToArray();
foreach (var item in addrs)
{
var ni = gbInfo.Tag as NetworkInterface;
if (ni == null) return;
args = $"interface ip add address name=\"{ni.Name}\" {item} {mark} {gateway}";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
}
var args = $"interface ip set address name=\"{ni.Name}\" source=dhcp";
var rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
MessageBox.Show($"执行成功!返回 {rs}");
}
args = $"interface ip set dns name=\"{ni.Name}\" source=dhcp";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
private void btnRestore_Click(Object sender, EventArgs e)
{
var ni = gbInfo.Tag as NetworkInterface;
if (ni == null) return;
rs = "ipconfig".Run("/renew");
var args = $"interface ip set address name=\"{ni.Name}\" source=dhcp";
var rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
MessageBox.Show($"执行成功!返回 {rs}");
}
args = $"interface ip set dns name=\"{ni.Name}\" source=dhcp";
rs = "netsh".Run(args, 5_000, s => XTrace.WriteLine(s));
rs = "ipconfig".Run("/renew");
MessageBox.Show($"执行成功!返回 {rs}");
}
}

18
XCoder/XNet/FrmMain.cs

@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
using NewLife;
using NewLife.Data;
using NewLife.Log;
@ -15,9 +10,6 @@ using NewLife.Threading;
using NewLife.Windows;
using XCoder;
using XCoder.XNet;
#if !NET4
using TaskEx = System.Threading.Tasks.Task;
#endif
namespace XNet
{
@ -406,13 +398,12 @@ namespace XNet
ts.Add(task);
}
_Send = TaskEx.WhenAll(ts);
_Send = Task.WhenAll(ts);
}
}
#if !NET4
else if (_Server != null)
{
TaskEx.Run(async () =>
Task.Run(async () =>
{
BizLog.Info("准备向[{0}]个客户端发送[{1}]次[{2}]的数据", _Server.SessionCount, count, buf.Length);
for (var i = 0; i < count && _Server != null; i++)
@ -421,11 +412,10 @@ namespace XNet
var cs = await _Server.SendAllAsync(buf);
sw.Stop();
BizLog.Info("{3}/{4} 已向[{0}]个客户端发送[{1}]数据 {2:n0}ms", cs, buf.Length, sw.ElapsedMilliseconds, i + 1, count);
if (sleep > 0) await TaskEx.Delay(sleep);
if (sleep > 0) await Task.Delay(sleep);
}
});
}
#endif
}
#endregion

Loading…
Cancel
Save