CRVM-redis-6/ICService/PushMessage.cs
2025-11-07 02:02:31 +08:00

153 lines
4.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ServiceModel;
using System.Threading;
//using CRVM.IDExcuter;
namespace ICService
{
// SessionMode.Required 允许Session会话
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallback))]
public interface IPushMessage
{
//----->IsOneWay = false等待服务器完成对方法处理;
//IsInitiating = true启动Session会话,
//IsTerminating = false 设置服务器发送回复后不关闭会话
[OperationContract(IsOneWay = true, IsInitiating = true, IsTerminating = false)]
void Login(string uid);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void Update(string uid);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void Leave(string uid);
}
public interface ICallback
{
[OperationContract(IsOneWay = true)]
//void ShowMsg(Machine msg);
void ShowMsg(AllData data);
}
public class Client
{
public ICallback callback;
public DateTime updatetime;
public Client(ICallback callback, DateTime updatetime)
{
this.callback = callback;
this.updatetime = updatetime;
}
}
// InstanceContextMode.PerSession 服务器为每个客户会话创建一个新的上下文对象。ConcurrencyMode.Multiple 异步的多线程实例
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class PushMessage : IPushMessage
{
static Dictionary<string, Client> dit_callback = new Dictionary<string, Client>();//创建一个静态Dictionary表示键和值集合(字典)用于记录在线成员Dictionary<(Of <(TKey, TValue>)>) 泛型类
private static List<string> uidRemoveed = new List<string>();//记录已经断开的连接对象
private static Object syncObj = new Object();////定义一个静态对象用于线程部份代码块的锁定用于lock操作
public void Login(string uid)
{
lock (syncObj)
{
dit_callback.Add(uid, new Client(OperationContext.Current.GetCallbackChannel<ICallback>(), DateTime.Now));
}
}
public void Update(string uid)
{
lock (syncObj)
{
if (dit_callback.ContainsKey(uid))
{
dit_callback.Remove(uid);
}
dit_callback.Add(uid, new Client(OperationContext.Current.GetCallbackChannel<ICallback>(), DateTime.Now));
}
}
public void Leave(string uid)
{
lock (syncObj)
{
uidRemoveed.Add(uid);
}
}
public static void SendMsg(AllData data)
{
lock (syncObj)
{
//Console.WriteLine("在线用户数(" + dit_callback.Count + ") 群发信息:" + msg);
foreach (var item in dit_callback)
{
try
{
//Console.WriteLine($"now time:{DateTime.Now.ToString("yyyy-mm-dd hh:mm:ss:FFF")},uid:{item.Key}");
if (!uidRemoveed.Contains(item.Key))
{
item.Value.callback.ShowMsg(data);
}
}
catch (Exception)
{
uidRemoveed.Add(item.Key);
Console.WriteLine("发送异常,用户=" + item.Key + "");
}
}
foreach (string item in uidRemoveed)
{
dit_callback.Remove(item);
}
uidRemoveed.Clear();
}
}
}
public class MacDataEventArgs : EventArgs
{
public AllData data;
public MacDataEventArgs(AllData data)
{
this.data = data;
}
}
public delegate void MacDataHandle(object sender, MacDataEventArgs e);
public class Callback : ICallback
{
public event MacDataHandle MacDataChanged;
public void ShowMsg(AllData data)
{
if (MacDataChanged != null)
{
MacDataChanged.Invoke(this, new MacDataEventArgs(data));
}
}
}
[Serializable]
public class AllData
{
public double[] vibData { get; set; }
public double[] standSpeed { get; set; }
public bool cutState { get; set; }
public double lenthSpeed { get; set; }
public double stripLength { get; set; }
}
}