PushGroupClient.cs
5.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
using HslCommunication.Core;
using HslCommunication.Core.Net;
using System;
using System.Collections.Generic;
namespace HslCommunication.Enthernet
{
/// <summary>
/// 订阅分类的核心组织对象
/// </summary>
public class PushGroupClient : IDisposable
{
#region Constructor
/// <summary>
/// 实例化一个默认的对象
/// </summary>
public PushGroupClient()
{
appSessions = new List<AppSession>();
simpleHybird = new SimpleHybirdLock();
}
#endregion
#region Public Method
/// <summary>
/// 新增一个订阅的会话
/// </summary>
/// <param name="session">会话</param>
public void AddPushClient(AppSession session)
{
simpleHybird.Enter();
appSessions.Add(session);
simpleHybird.Leave();
}
/// <summary>
/// 移除一个订阅的会话
/// </summary>
/// <param name="clientID">客户端唯一的ID信息</param>
public bool RemovePushClient(string clientID)
{
bool result = false;
simpleHybird.Enter();
for (int i = 0; i < appSessions.Count; i++)
{
if (appSessions[i].ClientUniqueID == clientID)
{
appSessions[i].WorkSocket?.Close();
appSessions.RemoveAt(i);
result = true;
break;
}
}
simpleHybird.Leave();
return result;
}
/// <summary>
/// 使用固定的发送方法将数据发送出去
/// </summary>
/// <param name="content">数据内容</param>
/// <param name="send">指定的推送方法</param>
public void PushString(string content, Action<AppSession, string> send)
{
simpleHybird.Enter();
System.Threading.Interlocked.Increment(ref pushTimesCount);
for (int i = 0; i < appSessions.Count; i++)
{
send(appSessions[i], content);
}
simpleHybird.Leave();
}
/// <summary>
/// 移除并关闭所有的客户端
/// </summary>
public int RemoveAllClient()
{
int result = 0;
simpleHybird.Enter();
for (int i = 0; i < appSessions.Count; i++)
{
appSessions[i].WorkSocket?.Close();
}
result = appSessions.Count;
appSessions.Clear();
simpleHybird.Leave();
return result;
}
/// <summary>
/// 获取是否推送过数据
/// </summary>
/// <returns>True代表有,False代表没有</returns>
public bool HasPushedContent()
{
return pushTimesCount > 0L;
}
#endregion
#region Private Member
private List<AppSession> appSessions; // 所有的客户端信息
private SimpleHybirdLock simpleHybird; // 列表的锁
private long pushTimesCount = 0L; // 推送的次数总和
#endregion
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
/// <summary>
/// 释放当前的程序所占用的资源
/// </summary>
/// <param name="disposing">是否释放资源</param>
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
simpleHybird.Enter();
appSessions.ForEach(m => m.WorkSocket?.Close());
appSessions.Clear();
simpleHybird.Leave();
simpleHybird.Dispose();
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~PushGroupClient() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
/// <summary>
/// 释放当前的对象所占用的资源
/// </summary>
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
#region Object Override
/// <summary>
/// 获取本对象的字符串表示形式
/// </summary>
/// <returns></returns>
public override string ToString()
{
return "PushGroupClient";
}
#endregion
}
}