2020-10-13 08:54:24 +08:00
|
|
|
|
using Prism.Mvvm;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using OnlineUserPool.Hander;
|
|
|
|
|
|
using OnlineUserPool.Model;
|
|
|
|
|
|
using OnlineUserPool.Unility;
|
|
|
|
|
|
using Serilog;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Net;
|
|
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using System.Windows.Threading;
|
|
|
|
|
|
using System.Diagnostics;
|
2021-01-18 20:24:19 +08:00
|
|
|
|
using OnlineUserPool.Services;
|
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
using System.Collections.Concurrent;
|
2021-07-07 09:49:36 +08:00
|
|
|
|
using System.IO.Compression;
|
|
|
|
|
|
using System.IO;
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
|
|
|
|
|
namespace OnlineUserPool.ViewModels
|
|
|
|
|
|
{
|
|
|
|
|
|
public class MainWindowViewModel : BindableBase
|
2021-01-18 20:24:19 +08:00
|
|
|
|
{
|
2020-10-13 08:54:24 +08:00
|
|
|
|
public ObservableCollection<HostModel> Clients { get; private set; } = new ObservableCollection<HostModel>();
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private static ConcurrentBag<MsgModel> receiveMes = new ConcurrentBag<MsgModel>();
|
2020-10-13 08:54:24 +08:00
|
|
|
|
private static object locker = new object();
|
|
|
|
|
|
public static System.Timers.Timer timer;
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private static IHandle mapRecordRankingHander;
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
|
|
|
|
|
private Dispatcher dispatcher;
|
|
|
|
|
|
public ObservableCollection<MsgModel> Customers { get; private set; } =
|
|
|
|
|
|
new ObservableCollection<MsgModel>();
|
|
|
|
|
|
|
2020-10-27 10:20:47 +08:00
|
|
|
|
private string _Title = "";
|
|
|
|
|
|
public string Title
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _Title; }
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
SetProperty(ref _Title, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private string _SendDataSize = "";
|
|
|
|
|
|
public string SendDataSize
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _SendDataSize; }
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
SetProperty(ref _SendDataSize, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//private IService _udpService;
|
2020-10-13 08:54:24 +08:00
|
|
|
|
public MainWindowViewModel()
|
|
|
|
|
|
{
|
2021-06-24 09:20:01 +08:00
|
|
|
|
Title = $"{ IPAddress.Any }:{ ConfigHelp.UdpPort }";
|
2020-10-27 10:20:47 +08:00
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
dispatcher = Dispatcher.CurrentDispatcher;
|
|
|
|
|
|
|
|
|
|
|
|
//Customers.Add("suntao");
|
|
|
|
|
|
WriteLine(DateTime.Now.ToShortDateString());
|
|
|
|
|
|
LogHelper.Init();
|
2021-07-07 09:49:36 +08:00
|
|
|
|
mapRecordRankingHander = new MapRecordRankingHander();//new MultiUserHandle();//
|
2021-06-24 09:20:01 +08:00
|
|
|
|
//mapRecordRankingHander = new MultiUserHandle();
|
|
|
|
|
|
Log.Information($"初始化连接,当前地址:{ IPAddress.Any }:{ConfigHelp.UdpPort}");
|
2021-01-18 20:24:19 +08:00
|
|
|
|
|
2021-07-07 09:49:36 +08:00
|
|
|
|
new TcpService1().RunServer(ReceivedData, CientDisconnected);
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//var tet = new System.Collections.Concurrent.ConcurrentBag<object>();
|
|
|
|
|
|
|
|
|
|
|
|
var _udpService = new UdpService();
|
|
|
|
|
|
_udpService.RunServer(ReceivedData);
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
Log.Information("服务启动成功");
|
|
|
|
|
|
timer = new System.Timers.Timer(1000);
|
|
|
|
|
|
timer.Elapsed += Timer_Elapsed;
|
|
|
|
|
|
timer.AutoReset = true;
|
|
|
|
|
|
timer.Start();
|
|
|
|
|
|
Log.Information("等待连接");
|
|
|
|
|
|
//Console.ReadKey();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-07 09:49:36 +08:00
|
|
|
|
private void ReceivedData(IPEndPoint remoteIpEndPoint, ReceiveModel msg, IService service)
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
dispatcher.Invoke(() =>
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
if (!Clients.Any(c => c.Equals(remoteIpEndPoint)))
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
Clients.Add(new HostModel
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
IPEndPoint = remoteIpEndPoint,
|
|
|
|
|
|
LastActiveTime = DateTime.Now,
|
2021-07-07 09:49:36 +08:00
|
|
|
|
//RouteId = msg.RouteId,
|
|
|
|
|
|
//MemberId = msg.MemberId,
|
|
|
|
|
|
//V = msg.V,
|
|
|
|
|
|
//Encoding = msg.Encoding,
|
|
|
|
|
|
//Client = msg.Client,
|
2021-01-18 20:24:19 +08:00
|
|
|
|
Service = service
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
2021-07-07 09:49:36 +08:00
|
|
|
|
switch (msg.CommandType)
|
|
|
|
|
|
{
|
|
|
|
|
|
//ping命令
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
{
|
|
|
|
|
|
var client = Clients.FirstOrDefault(n => n.Equals(remoteIpEndPoint));
|
|
|
|
|
|
client.LastActiveTime = DateTime.Now;
|
|
|
|
|
|
if(msg.V > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
client.V = msg.V;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
//消息
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
{
|
|
|
|
|
|
var client = Clients.FirstOrDefault(n => n.Equals(remoteIpEndPoint));
|
|
|
|
|
|
var msg1 = (msg as MsgModel);
|
|
|
|
|
|
client.Competitionid = msg1.Competitionid;
|
|
|
|
|
|
if (msg1.V > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
client.V = msg1.V;
|
|
|
|
|
|
}
|
|
|
|
|
|
receiveMes.Add(msg1);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
//设置客户端
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
{
|
|
|
|
|
|
var client = Clients.FirstOrDefault(n => n.Equals(remoteIpEndPoint));
|
|
|
|
|
|
var msg1 = (msg as SetClientCommand);
|
|
|
|
|
|
client.Encoding = msg1.Encoding;
|
|
|
|
|
|
client.Client = msg1.Client;
|
|
|
|
|
|
client.V = msg1.V;
|
|
|
|
|
|
client.MemberId = msg1.MemberId;
|
|
|
|
|
|
client.Competitionid = msg1.Competitionid;
|
|
|
|
|
|
client.IsWatch = msg1.IsWatch;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
//case 3:
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var client = Clients.FirstOrDefault(n => n.Equals(remoteIpEndPoint));
|
|
|
|
|
|
// var msg1 = (msg as SetWatchCommand);
|
|
|
|
|
|
// client.Competitionid = msg1.Competitionid;
|
|
|
|
|
|
// client.IsWatch = true;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2021-01-18 20:24:19 +08:00
|
|
|
|
if (msg.CommandType == 0)
|
|
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//client.ShowVirtual = msg.ShowVirtual;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (msg.CommandType == 1)
|
|
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
NotifyClient();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
private void NotifyClient()
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2021-06-24 09:20:01 +08:00
|
|
|
|
if(!receiveMes.Any())
|
|
|
|
|
|
{
|
|
|
|
|
|
dispatcher.Invoke(() =>
|
|
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
//Customers.Clear();
|
2021-06-24 09:20:01 +08:00
|
|
|
|
|
|
|
|
|
|
//删除已经发送的数据
|
|
|
|
|
|
//receiveMes.Clear();
|
|
|
|
|
|
//移除5钟内连接不上的客户端
|
|
|
|
|
|
Clients.ToList().ForEach(item =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.Expire)
|
|
|
|
|
|
{
|
|
|
|
|
|
Clients.Remove(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
lock (locker)
|
|
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
var msgs = CloneJson(receiveMes).ToList();
|
2021-01-18 20:24:19 +08:00
|
|
|
|
receiveMes.Clear();
|
|
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
//加入虚拟人物消息
|
|
|
|
|
|
var virtualData = mapRecordRankingHander.GetVirtualUserData();
|
|
|
|
|
|
WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "-当前在线人数:" + Clients.Count + "-当前虚拟人数:" + virtualData.Count);
|
2021-01-18 20:24:19 +08:00
|
|
|
|
|
2020-10-13 08:54:24 +08:00
|
|
|
|
#if DEBUG
|
2021-07-07 09:49:36 +08:00
|
|
|
|
WriteLine($"在线人:{Newtonsoft.Json.JsonConvert.SerializeObject(msgs)}");
|
2020-10-13 08:54:24 +08:00
|
|
|
|
//\r\n虚拟人:{Newtonsoft.Json.JsonConvert.SerializeObject(virtualData)}
|
|
|
|
|
|
#endif
|
2021-07-07 09:49:36 +08:00
|
|
|
|
msgs.AddRange(virtualData);
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
2021-07-07 09:49:36 +08:00
|
|
|
|
SendMessage(Clients, msgs);
|
2020-10-13 08:54:24 +08:00
|
|
|
|
|
|
|
|
|
|
dispatcher.Invoke(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
Customers.Clear();
|
2021-07-07 09:49:36 +08:00
|
|
|
|
foreach (var item in msgs)
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2020-10-27 10:20:47 +08:00
|
|
|
|
if (Customers.Any(c => c.MemberId == item.MemberId))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
Customers.Add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//移除下线的客户端
|
2021-07-07 09:49:36 +08:00
|
|
|
|
for (int i = 0; i < msgs.Count; i++)
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
if (msgs[i].exit && msgs[i].MemberId >0)//客户端退出,并且不是虚拟的人物
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
|
|
|
|
|
//这个地方有严重的逻辑错误(虚拟的人物不能和真实的人用同一个名字)
|
2021-07-07 09:49:36 +08:00
|
|
|
|
var info = Clients.FirstOrDefault(n => n.MemberId == msgs[i].MemberId);
|
2020-10-13 08:54:24 +08:00
|
|
|
|
if (info != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Clients.Remove(info);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//删除已经发送的数据
|
|
|
|
|
|
//receiveMes.Clear();
|
|
|
|
|
|
//移除5钟内连接不上的客户端
|
2020-10-13 08:54:24 +08:00
|
|
|
|
Clients.ToList().ForEach(item =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.Expire)
|
|
|
|
|
|
{
|
|
|
|
|
|
Clients.Remove(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
//更新虚拟人物信息
|
2021-01-18 20:24:19 +08:00
|
|
|
|
mapRecordRankingHander.RemoveEndAndAddNewVirtualUser(Customers.Count);
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
2020-10-27 10:20:47 +08:00
|
|
|
|
Log.Error($"NotifyClient:{ e.Message }\r\n{ e.StackTrace }");
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private void SendMessage(Collection<HostModel> clients, List<MsgModel> msgModels)
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
2021-08-18 09:57:49 +08:00
|
|
|
|
if (!clients.Any() || !msgModels.Any())
|
2021-06-24 09:20:01 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2021-01-18 20:24:19 +08:00
|
|
|
|
var clients1 = clients.ToList();
|
2021-06-24 09:20:01 +08:00
|
|
|
|
|
2021-01-18 20:24:19 +08:00
|
|
|
|
var list = CloneJson<List<MsgModel>>(msgModels);
|
|
|
|
|
|
foreach (var item in list)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.PreDistance = Math.Round(item.PreDistance, 5);
|
|
|
|
|
|
item.EndDistance = Math.Round(item.EndDistance, 5);
|
|
|
|
|
|
item.WeightKg = Math.Round(item.WeightKg, 2);
|
|
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(list.Select(m=> new {
|
2020-12-01 10:13:53 +08:00
|
|
|
|
m.RouteId,
|
|
|
|
|
|
m.MemberId,
|
|
|
|
|
|
m.Point,
|
|
|
|
|
|
m.IsCompleted,
|
|
|
|
|
|
m.exit,
|
|
|
|
|
|
m.Speed,
|
|
|
|
|
|
m.PreDistance,
|
|
|
|
|
|
m.EndDistance,
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//m.IsVirtual,//后面要把这个字段过滤掉
|
2020-12-01 10:13:53 +08:00
|
|
|
|
m.WeightKg,
|
2020-12-16 13:47:20 +08:00
|
|
|
|
m.Competitionid,
|
2021-01-18 20:24:19 +08:00
|
|
|
|
m.Saved,
|
2020-12-01 10:13:53 +08:00
|
|
|
|
}));
|
2020-10-13 08:54:24 +08:00
|
|
|
|
var data = Encoding.ASCII.GetBytes(jsonString);
|
2021-06-24 09:20:01 +08:00
|
|
|
|
//SendDataSize = (data.Length/1000D).ToString() +"KB";
|
2021-01-18 20:24:19 +08:00
|
|
|
|
|
|
|
|
|
|
var strV1 = string.Join("|", list.Select(m => m.ToString(1)));
|
2021-06-24 09:20:01 +08:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(strV1))
|
|
|
|
|
|
{
|
|
|
|
|
|
strV1 += "|";
|
|
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//strV1 = "abcdefghijklmnopqrstuvwxyz";
|
2021-06-24 09:20:01 +08:00
|
|
|
|
//System.IO.File.AppendAllText(System.Environment.CurrentDirectory + "要发送的数据.txt", strV1.Trim().Replace("\0", "") + "\r\n", Encoding.UTF8);
|
2021-01-18 20:24:19 +08:00
|
|
|
|
WriteLine(strV1);
|
|
|
|
|
|
WriteLine(strV1.Length.ToString());
|
2021-07-07 09:49:36 +08:00
|
|
|
|
//var dataV1 = Encoding.UTF8.GetBytes(strV1);
|
|
|
|
|
|
//var dataV1ForUdp = strV1.Last() == '|' ? Encoding.ASCII.GetBytes(strV1.Substring(0, strV1.Length - 1)) : dataV1;
|
|
|
|
|
|
|
|
|
|
|
|
//var dataCompressV1 = Encoding.UTF8.GetBytes($"*{ Convert.ToBase64String(CommonHelper.Compress(strV1)) }#");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var data1 = new Data1(strV1);
|
|
|
|
|
|
var data1ForUdp = new Data1(strV1.Last() == '|' ? strV1.Substring(0, strV1.Length - 1) : strV1);
|
2021-01-18 20:24:19 +08:00
|
|
|
|
|
2021-07-07 09:49:36 +08:00
|
|
|
|
//var watchList = string.Join('|', clients1.Where(c => c.IsWatch).Select(c => c.MemberId));
|
|
|
|
|
|
//var strV2 = $"*l{{{ strV1 }}};w{{{ watchList }}}#";
|
|
|
|
|
|
////var dataCompressV2 = Encoding.UTF8.GetBytes($"{ Convert.ToBase64String(CommonHelper.Compress(strV2)) }");
|
|
|
|
|
|
//var data2 = new Data1(strV2);
|
|
|
|
|
|
|
|
|
|
|
|
SendDataSize = $"\t单客户端数据包V1:{ data1.GetBytes().Length/1000D }KB,一共占用带宽:{ data1.GetBytes().Length / 1000D * clients1.Count }KB,压缩以后{ data1.GetBytes(true).Length/1000D * clients1.Count }KB";
|
|
|
|
|
|
|
|
|
|
|
|
#region udp发送数据
|
2021-01-18 20:24:19 +08:00
|
|
|
|
foreach (var item in clients1)
|
2020-10-13 08:54:24 +08:00
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
if(item == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
//if((item.Service is UdpService) ==false)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// continue;
|
|
|
|
|
|
//}
|
|
|
|
|
|
if (item.V != 1 && item.V != 2)
|
2021-06-24 09:20:01 +08:00
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
item.Service.Send(data, data.Length, item.IPEndPoint);
|
2021-06-24 09:20:01 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
if (item.V == 1 && item.Service is UdpService)
|
2021-06-24 09:20:01 +08:00
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
item.Service.Send(data1ForUdp.GetBytes(), data1ForUdp.GetBytes().Length, item.IPEndPoint);
|
2021-01-18 20:24:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2021-07-07 09:49:36 +08:00
|
|
|
|
Data1 ddd = null;// = item.V == 1 ? ;
|
|
|
|
|
|
if (item.V == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
ddd = data1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (item.V == 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
//ddd = data2;
|
|
|
|
|
|
|
2021-08-12 12:26:43 +08:00
|
|
|
|
var temp = string.Join("|", list.Where(m => m.Competitionid == item.Competitionid).Select(m => m.ToString(2))) + "|";
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
|
|
|
|
|
var watchList1 = string.Join('|', clients1.Where(c => c.IsWatch && c.Competitionid == item.Competitionid).Select(c => c.MemberId));
|
|
|
|
|
|
var strV21 = $"*l{{{ temp }}};w{{{ watchList1 }}}#";
|
|
|
|
|
|
ddd = new Data1(strV21);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
bool isZip = item.Encoding == "gzip";
|
|
|
|
|
|
item.Service.Send(ddd.GetBytes(isZip), ddd.GetBytes(isZip).Length, item.IPEndPoint);
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
Debug.WriteLine(e.Message);
|
|
|
|
|
|
Log.Error($"{ item.IPEndPoint.ToString() }:{ e.Message }\r\n{ e.StackTrace }");
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
//#region tcp发送数据
|
|
|
|
|
|
//var tcpClient = clients1.Where(c => c.Service is TcpService1).FirstOrDefault();
|
|
|
|
|
|
//if(tcpClient != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// tcpClient.Service.Send(dataV1, dataV1.Length, null);
|
|
|
|
|
|
//}
|
|
|
|
|
|
//#endregion
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WriteLine(string str)
|
|
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//Debug.WriteLine(str);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
T CloneJson<T>(T source)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Don't serialize a null object, simply return the default for that object
|
|
|
|
|
|
if (Object.ReferenceEquals(source, null))
|
|
|
|
|
|
{
|
|
|
|
|
|
return default(T);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// initialize inner objects individually
|
|
|
|
|
|
// for example in default constructor some list property initialized with some values,
|
|
|
|
|
|
// but in 'source' these items are cleaned -
|
|
|
|
|
|
// without ObjectCreationHandling.Replace default constructor values will be added to result
|
|
|
|
|
|
var deserializeSettings = new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace };
|
|
|
|
|
|
|
|
|
|
|
|
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
2021-07-07 09:49:36 +08:00
|
|
|
|
|
|
|
|
|
|
private void CientDisconnected(EndPoint point)
|
2021-08-18 09:57:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
dispatcher.Invoke(() =>
|
2021-07-07 09:49:36 +08:00
|
|
|
|
{
|
2021-08-18 09:57:49 +08:00
|
|
|
|
try
|
2021-07-07 09:49:36 +08:00
|
|
|
|
{
|
2021-08-18 09:57:49 +08:00
|
|
|
|
var client = Clients.FirstOrDefault(f => f.IPEndPoint.ToString() == point.ToString());
|
|
|
|
|
|
if (client != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Clients.Remove(client);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch(Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Log.Information("在CientDisconnected触发以后,删除client时报错了,"+ ex.Message +", " + ex.StackTrace);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2021-07-07 09:49:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class Data1
|
|
|
|
|
|
{
|
|
|
|
|
|
private string _txt = "";
|
|
|
|
|
|
public Data1(string txt)
|
|
|
|
|
|
{
|
|
|
|
|
|
this._txt = txt;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public byte[] GetBytes(bool compress = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (compress)
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetCompressBytes();
|
|
|
|
|
|
}
|
|
|
|
|
|
return Encoding.UTF8.GetBytes(this._txt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private byte[] GetCompressBytes()
|
|
|
|
|
|
{
|
|
|
|
|
|
var temp = this._txt;
|
|
|
|
|
|
if(temp[0] == '*')
|
|
|
|
|
|
{
|
|
|
|
|
|
temp = temp.Substring(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
if(temp.Last() == '#')
|
|
|
|
|
|
{
|
|
|
|
|
|
temp = temp.Substring(0, temp.Length - 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
return Encoding.UTF8.GetBytes($"*{ Convert.ToBase64String(CommonHelper.Compress(temp)) }#");
|
|
|
|
|
|
}
|
2020-10-13 08:54:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|