153 lines
4.8 KiB
C#
153 lines
4.8 KiB
C#
|
|
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; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|