XFEExtension
【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFEExtension.NetCore/CyberComm/CyberCommClient.cs
+2
-218
Added
XFEExtension.NetCore/CyberComm/CyberCommClientEventArgs.cs
+58
-0
Added
XFEExtension.NetCore/CyberComm/CyberCommClientEventArgsImpl.cs
+10
-0
Added
XFEExtension.NetCore/CyberComm/CyberCommRequestEventArgs.cs
+72
-0
Added
XFEExtension.NetCore/CyberComm/CyberCommRequestEventArgsImpl.cs
+11
-0
Modified
XFEExtension.NetCore/CyberComm/CyberCommServer.cs
+57
-23
Added
XFEExtension.NetCore/CyberComm/CyberCommServerEventArgs.cs
+94
-0
Added
XFEExtension.NetCore/CyberComm/CyberCommServerEventArgsImpl.cs
+11
-0
XFEstudio/XFEExtension
fix-修复原本的CyberCommServer中的一些错误 add-CyberCommServer现支持Http请求
e5a6861
代码差异
8 个文件
+315
-241
@@ -1,5 +1,4 @@
1
using System.Collections.Specialized;
2
using System.Net.WebSockets;
1
using System.Net.WebSockets;
3
2
using System.Text;
4
3
5
4
namespace XFEExtension.NetCore.CyberComm;
@@ -213,219 +212,4 @@ public class CyberCommClient
213
212
/// </summary>
214
213
public CyberCommClient() { }
215
214
#endregion
216
}
217
#region 事件参数及其实现类
218
/// <summary>
219
/// CyberComm客户端事件参数
220
/// </summary>
221
public abstract class CyberCommClientEventArgs : EventArgs
222
{
223
/// <summary>
224
/// 消息类型
225
/// </summary>
226
public BackMessageType MessageType { get; }
227
/// <summary>
228
/// 当前WebSocket
229
/// </summary>
230
public ClientWebSocket CurrentWebSocket { get; }
231
/// <summary>
232
/// 文本消息
233
/// </summary>
234
public string? TextMessage { get; }
235
/// <summary>
236
/// 异常消息(如果有的话)
237
/// </summary>
238
public XFECyberCommException? Exception { get; }
239
/// <summary>
240
/// 二进制消息
241
/// </summary>
242
public byte[]? BinaryMessage { get; }
243
/// <summary>
244
/// 发送文本消息
245
/// </summary>
246
/// <param name="message">待发送的文本</param>
247
/// <exception cref="XFECyberCommException"></exception>
248
/// <returns>发送进程</returns>
249
public async Task ReplyMessage(string message)
250
{
251
try
252
{
253
byte[] sendBuffer = Encoding.UTF8.GetBytes(message);
254
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
255
}
256
catch (Exception ex)
257
{
258
throw new XFECyberCommException("收到服务器端数据后客户端回复文本数据时出现异常", ex);
259
}
260
}
261
/// <summary>
262
/// 关闭连接
263
/// </summary>
264
/// <exception cref="XFECyberCommException"></exception>
265
public async Task Close()
266
{
267
try
268
{
269
await CurrentWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection Closed", CancellationToken.None);
270
}
271
catch (Exception ex)
272
{
273
throw new XFECyberCommException("关闭客户端连接时出现异常", ex);
274
}
275
}
276
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, string message)
277
{
278
CurrentWebSocket = clientWebSocket;
279
TextMessage = message;
280
MessageType = BackMessageType.Text;
281
}
282
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, byte[] bytes)
283
{
284
CurrentWebSocket = clientWebSocket;
285
BinaryMessage = bytes;
286
MessageType = BackMessageType.Binary;
287
}
288
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, XFECyberCommException ex)
289
{
290
CurrentWebSocket = clientWebSocket;
291
Exception = ex;
292
MessageType = BackMessageType.Error;
293
}
294
}
295
/// <summary>
296
/// CyberComm服务器事件参数
297
/// </summary>
298
public abstract class CyberCommServerEventArgs
299
{
300
/// <summary>
301
/// 消息类型
302
/// </summary>
303
public BackMessageType MessageType { get; }
304
/// <summary>
305
/// 当前WebSocket
306
/// </summary>
307
public WebSocket CurrentWebSocket { get; }
308
/// <summary>
309
/// 客户端请求头
310
/// </summary>
311
public NameValueCollection WSHeader { get; }
312
/// <summary>
313
/// 异常消息(如果有的话)
314
/// </summary>
315
public XFECyberCommException? Exception { get; }
316
/// <summary>
317
/// 客户端IP地址
318
/// </summary>
319
public string IpAddress { get; }
320
/// <summary>
321
/// 文本消息
322
/// </summary>
323
public string? TextMessage { get; }
324
/// <summary>
325
/// 二进制消息
326
/// </summary>
327
public byte[]? BinaryMessage { get; }
328
/// <summary>
329
/// 发送文本消息
330
/// </summary>
331
/// <param name="message">待发送的文本</param>
332
/// <exception cref="XFECyberCommException"></exception>
333
/// <returns>发送进程</returns>
334
public async Task ReplyMessage(string message)
335
{
336
try
337
{
338
byte[] sendBuffer = Encoding.UTF8.GetBytes(message);
339
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
340
}
341
catch (Exception ex)
342
{
343
throw new XFECyberCommException("收到客户端数据后服务器端回复文本时出现异常", ex);
344
}
345
}
346
/// <summary>
347
/// 发送二进制消息
348
/// </summary>
349
/// <param name="bytes">二进制消息</param>
350
/// <exception cref="XFECyberCommException"></exception>
351
/// <returns></returns>
352
public async Task ReplyBinaryMessage(byte[] bytes)
353
{
354
try
355
{
356
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Binary, true, CancellationToken.None);
357
}
358
catch (Exception ex)
359
{
360
throw new XFECyberCommException("收到客户端数据后服务器端回复二进制数据时出现异常", ex);
361
}
362
}
363
/// <summary>
364
/// 关闭连接
365
/// </summary>
366
/// <exception cref="XFECyberCommException"></exception>
367
public async Task Close()
368
{
369
try
370
{
371
await CurrentWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection Closed", CancellationToken.None);
372
}
373
catch (Exception ex)
374
{
375
throw new XFECyberCommException("关闭服务器端连接时出现异常", ex);
376
}
377
}
378
/// <summary>
379
/// 强制关闭连接
380
/// </summary>
381
/// <exception cref="XFECyberCommException"></exception>
382
public void ForceClose()
383
{
384
try
385
{
386
CurrentWebSocket.Abort();
387
}
388
catch (Exception ex)
389
{
390
throw new XFECyberCommException("强制关闭服务器端连接时出现异常", ex);
391
}
392
}
393
internal CyberCommServerEventArgs(WebSocket webSocket, string message, string ipAddress, NameValueCollection wsHeader)
394
{
395
CurrentWebSocket = webSocket;
396
TextMessage = message;
397
IpAddress = ipAddress;
398
MessageType = BackMessageType.Text;
399
WSHeader = wsHeader;
400
}
401
internal CyberCommServerEventArgs(WebSocket webSocket, byte[] bytes, string ipAddress, NameValueCollection wsHeader)
402
{
403
CurrentWebSocket = webSocket;
404
BinaryMessage = bytes;
405
IpAddress = ipAddress;
406
MessageType = BackMessageType.Binary;
407
WSHeader = wsHeader;
408
}
409
internal CyberCommServerEventArgs(WebSocket webSocket, XFECyberCommException ex, string ipAddress, NameValueCollection wsHeader)
410
{
411
CurrentWebSocket = webSocket;
412
Exception = ex;
413
IpAddress = ipAddress;
414
MessageType = BackMessageType.Error;
415
WSHeader = wsHeader;
416
}
417
}
418
class CyberCommClientEventArgsImpl : CyberCommClientEventArgs
419
{
420
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, string message) : base(clientWebSocket, message) { }
421
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, byte[] bytes) : base(clientWebSocket, bytes) { }
422
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, XFECyberCommException ex) : base(clientWebSocket, ex) { }
423
}
424
class CyberCommServerEventArgsImpl : CyberCommServerEventArgs
425
{
426
internal CyberCommServerEventArgsImpl(WebSocket webSocket, string message, string ipAddress, NameValueCollection wsHeader) : base(webSocket, message, ipAddress, wsHeader) { }
427
internal CyberCommServerEventArgsImpl(WebSocket webSocket, byte[] bytes, string ipAddress, NameValueCollection wsHeader) : base(webSocket, bytes, ipAddress, wsHeader) { }
428
internal CyberCommServerEventArgsImpl(WebSocket webSocket, XFECyberCommException ex, string ipAddress, NameValueCollection wsHeader) : base(webSocket, ex, ipAddress, wsHeader) { }
429
}
430
431
#endregion
215
}
@@ -0,0 +1,58 @@
1
using System.Net.WebSockets;
2
using System.Text;
3
4
namespace XFEExtension.NetCore.CyberComm;
5
6
/// <summary>
7
/// CyberComm客户端事件参数
8
/// </summary>
9
/// <param name="MessageType"> 消息类型 </param>
10
/// <param name="CurrentWebSocket"> 当前WebSocket </param>
11
/// <param name="TextMessage"> 文本消息 </param>
12
/// <param name="Exception"> 异常消息(如果有的话) </param>
13
/// <param name="BinaryMessage"> 二进制消息 </param>
14
public abstract record CyberCommClientEventArgs(BackMessageType MessageType, ClientWebSocket CurrentWebSocket, string? TextMessage, XFECyberCommException? Exception, byte[]? BinaryMessage)
15
{
16
/// <summary>
17
/// 发送文本消息
18
/// </summary>
19
/// <param name="message">待发送的文本</param>
20
/// <exception cref="XFECyberCommException"></exception>
21
/// <returns>发送进程</returns>
22
public async Task ReplyMessage(string message)
23
{
24
try
25
{
26
byte[] sendBuffer = Encoding.UTF8.GetBytes(message);
27
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
28
}
29
catch (Exception ex)
30
{
31
throw new XFECyberCommException("收到服务器端数据后客户端回复文本数据时出现异常", ex);
32
}
33
}
34
/// <summary>
35
/// 关闭连接
36
/// </summary>
37
/// <exception cref="XFECyberCommException"></exception>
38
public async Task Close()
39
{
40
try
41
{
42
await CurrentWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection Closed", CancellationToken.None);
43
}
44
catch (Exception ex)
45
{
46
throw new XFECyberCommException("关闭客户端连接时出现异常", ex);
47
}
48
}
49
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, string message) : this(BackMessageType.Text, clientWebSocket, message, null, null)
50
{
51
}
52
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, byte[] bytes) : this(BackMessageType.Binary, clientWebSocket, null, null, bytes)
53
{
54
}
55
internal CyberCommClientEventArgs(ClientWebSocket clientWebSocket, XFECyberCommException ex) : this(BackMessageType.Error, clientWebSocket, null, ex, null)
56
{
57
}
58
}
@@ -0,0 +1,10 @@
1
using System.Net.WebSockets;
2
3
namespace XFEExtension.NetCore.CyberComm;
4
5
record class CyberCommClientEventArgsImpl : CyberCommClientEventArgs
6
{
7
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, string message) : base(clientWebSocket, message) { }
8
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, byte[] bytes) : base(clientWebSocket, bytes) { }
9
internal CyberCommClientEventArgsImpl(ClientWebSocket clientWebSocket, XFECyberCommException ex) : base(clientWebSocket, ex) { }
10
}
@@ -0,0 +1,72 @@
1
using System.Collections.Specialized;
2
using System.Net;
3
using System.Text;
4
5
namespace XFEExtension.NetCore.CyberComm;
6
7
/// <summary>
8
/// CyberComm服务器Http请求事件参数
9
/// </summary>
10
/// <param name="RequestURL">请求的URL地址</param>
11
/// <param name="RequestMethod">请求方法</param>
12
/// <param name="RequestBody">当请求方法为POST时的请求体</param>
13
/// <param name="RequestHeaders">请求头</param>
14
/// <param name="QueryString">查询请求</param>
15
/// <param name="Request">请求对象</param>
16
/// <param name="Response">响应对象</param>
17
/// <param name="ClientIP">客户端IP</param>
18
public abstract record class CyberCommRequestEventArgs(Uri? RequestURL, string RequestMethod, string? RequestBody, NameValueCollection RequestHeaders, NameValueCollection QueryString, HttpListenerRequest Request, HttpListenerResponse Response, string ClientIP)
19
{
20
/// <summary>
21
/// 回复消息并关闭连接
22
/// </summary>
23
/// <param name="message">待回复消息</param>
24
/// <param name="statusCode">状态码</param>
25
/// <returns></returns>
26
public async Task ReplyAndClose(string message, HttpStatusCode statusCode = HttpStatusCode.OK)
27
{
28
Response.StatusCode = (int)statusCode;
29
byte[] buffer = Encoding.UTF8.GetBytes(message);
30
Response.ContentLength64 = buffer.Length;
31
await Response.OutputStream.WriteAsync(buffer);
32
Response.Close();
33
}
34
/// <summary>
35
/// 回复消息
36
/// </summary>
37
/// <param name="message">待回复消息</param>
38
/// <returns></returns>
39
public async Task ReplyMessage(string message)
40
{
41
byte[] buffer = Encoding.UTF8.GetBytes(message);
42
Response.ContentLength64 = buffer.Length;
43
await Response.OutputStream.WriteAsync(buffer);
44
}
45
/// <summary>
46
/// 回复二进制消息
47
/// </summary>
48
/// <param name="bytes">二进制消息</param>
49
/// <returns></returns>
50
public async Task ReplyBinaryMessage(byte[] bytes)
51
{
52
Response.ContentLength64 = bytes.Length;
53
await Response.OutputStream.WriteAsync(bytes);
54
}
55
/// <summary>
56
/// 关闭连接
57
/// </summary>
58
/// <param name="statusCode">状态码</param>
59
public void Close(HttpStatusCode statusCode = HttpStatusCode.OK)
60
{
61
Response.StatusCode = (int)statusCode;
62
Response.Close();
63
}
64
/// <summary>
65
/// 以错误请求关闭连接
66
/// </summary>
67
public void CloseWhitBadRequest()
68
{
69
Response.StatusCode = 400;
70
Response.Close();
71
}
72
}
@@ -0,0 +1,11 @@
1
using System.Collections.Specialized;
2
using System.Net;
3
4
namespace XFEExtension.NetCore.CyberComm;
5
6
record class CyberCommRequestEventArgsImpl : CyberCommRequestEventArgs
7
{
8
public CyberCommRequestEventArgsImpl(Uri? RequestURL, string RequestMethod, string? RequestBody, NameValueCollection RequestHeaders, NameValueCollection QueryString, HttpListenerRequest Request, HttpListenerResponse Response, string ClientIP) : base(RequestURL, RequestMethod, RequestBody, RequestHeaders, QueryString, Request, Response, ClientIP)
9
{
10
}
11
}
@@ -10,7 +10,7 @@ namespace XFEExtension.NetCore.CyberComm;
10
10
/// </summary>
11
11
public class CyberCommServer
12
12
{
13
private readonly string serverURL;
13
private readonly string[] serverURLs;
14
14
#region 公共属性
15
15
/// <summary>
16
16
/// 是否自动接收完整消息
@@ -33,9 +33,13 @@ public class CyberCommServer
33
33
/// </summary>
34
34
public event EventHandler<CyberCommServerEventArgs>? ConnectionClosed;
35
35
/// <summary>
36
/// WebSocket服务器
36
/// Http请求接收时触发
37
37
/// </summary>
38
public HttpListener WebSocketServer { get; } = new HttpListener();
38
public event EventHandler<CyberCommRequestEventArgs>? RequestReceived;
39
/// <summary>
40
/// 服务器端
41
/// </summary>
42
public HttpListener Server { get; } = new();
39
43
#endregion
40
44
#region 公有方法
41
45
/// <summary>
@@ -46,20 +50,45 @@ public class CyberCommServer
46
50
{
47
51
try
48
52
{
49
WebSocketServer.Prefixes.Add(serverURL);
50
WebSocketServer.Start();
53
foreach (var url in serverURLs)
54
{
55
Server.Prefixes.Add(url);
56
}
57
Server.Start();
51
58
ServerStarted?.Invoke(this, EventArgs.Empty);
52
59
while (true)
53
60
{
54
HttpListenerContext httpListenerContext = await WebSocketServer.GetContextAsync();
61
var httpListenerContext = await Server.GetContextAsync();
62
var requestURL = httpListenerContext.Request.Url;
63
var clientIP = httpListenerContext.Request.RemoteEndPoint.Address.ToString();
55
64
if (httpListenerContext.Request.IsWebSocketRequest)
56
65
{
57
HttpListenerWebSocketContext httpListenerWebSocketContext = await httpListenerContext.AcceptWebSocketAsync(null);
58
string clientIP = httpListenerContext.Request.RemoteEndPoint.Address.ToString();
59
WebSocket webSocket = httpListenerWebSocketContext.WebSocket;
60
NameValueCollection wsHeader = httpListenerWebSocketContext.Headers;
61
ClientConnected?.Invoke(this, new CyberCommServerEventArgsImpl(webSocket, string.Empty, clientIP, wsHeader));
62
CyberCommClientConnected(webSocket, wsHeader, clientIP);
66
var httpListenerWebSocketContext = await httpListenerContext.AcceptWebSocketAsync(null);
67
var webSocket = httpListenerWebSocketContext.WebSocket;
68
var wsHeader = httpListenerWebSocketContext.Headers;
69
ClientConnected?.Invoke(this, new CyberCommServerEventArgsImpl(requestURL, webSocket, string.Empty, clientIP, wsHeader));
70
CyberCommClientConnected(requestURL, webSocket, wsHeader, clientIP);
71
}
72
else
73
{
74
var request = httpListenerContext.Request;
75
var response = httpListenerContext.Response;
76
var requestMethod = request.HttpMethod;
77
var headers = request.Headers;
78
var queryString = request.QueryString;
79
if (requestMethod == "POST" && AutoReceiveCompletedMessage)
80
{
81
_ = Task.Run(() =>
82
{
83
using var reader = new StreamReader(request.InputStream, request.ContentEncoding);
84
string postData = reader.ReadToEnd();
85
RequestReceived?.Invoke(this, new CyberCommRequestEventArgsImpl(requestURL, requestMethod, postData, headers, queryString, request, response, clientIP));
86
});
87
}
88
else
89
{
90
RequestReceived?.Invoke(this, new CyberCommRequestEventArgsImpl(requestURL, requestMethod, null, headers, queryString, request, response, clientIP));
91
}
63
92
}
64
93
}
65
94
}
@@ -68,7 +97,7 @@ public class CyberCommServer
68
97
throw new XFECyberCommException("启动服务器时发生异常", ex);
69
98
}
70
99
}
71
private async void CyberCommClientConnected(WebSocket webSocket, NameValueCollection wsHeader, string clientIP)
100
private async void CyberCommClientConnected(Uri? requestURL, WebSocket webSocket, NameValueCollection wsHeader, string clientIP)
72
101
{
73
102
while (webSocket.State == WebSocketState.Open)
74
103
{
@@ -91,11 +120,11 @@ public class CyberCommServer
91
120
if (receiveResult.MessageType == WebSocketMessageType.Text)
92
121
{
93
122
string receivedMessage = Encoding.UTF8.GetString(receivedBinaryBuffer);
94
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(webSocket, receivedMessage, clientIP, wsHeader));
123
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(requestURL, webSocket, receivedMessage, clientIP, wsHeader));
95
124
}
96
125
if (receiveResult.MessageType == WebSocketMessageType.Binary)
97
126
{
98
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(webSocket, receivedBinaryBuffer, clientIP, wsHeader));
127
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(requestURL, webSocket, receivedBinaryBuffer, clientIP, wsHeader));
99
128
}
100
129
if (receiveResult.MessageType == WebSocketMessageType.Close)
101
130
{
@@ -105,11 +134,11 @@ public class CyberCommServer
105
134
}
106
135
catch (Exception ex)
107
136
{
108
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(webSocket, new XFECyberCommException("与客户端端通讯期间发生异常", ex), clientIP, wsHeader));
137
MessageReceived?.Invoke(this, new CyberCommServerEventArgsImpl(requestURL, webSocket, new XFECyberCommException("与客户端端通讯期间发生异常", ex), clientIP, wsHeader));
109
138
break;
110
139
}
111
140
}
112
ConnectionClosed?.Invoke(this, new CyberCommServerEventArgsImpl(webSocket, string.Empty, clientIP, wsHeader));
141
ConnectionClosed?.Invoke(this, new CyberCommServerEventArgsImpl(requestURL, webSocket, string.Empty, clientIP, wsHeader));
113
142
webSocket.Dispose();
114
143
}
115
144
#endregion
@@ -117,21 +146,26 @@ public class CyberCommServer
117
146
/// <summary>
118
147
/// CyberComm服务器,使用端口创建
119
148
/// </summary>
120
/// <param name="listenPort">监听端口</param>
121
149
/// <param name="autoReceiveCompletedMessage">是否自动接收完整消息</param>
122
public CyberCommServer(int listenPort, bool autoReceiveCompletedMessage = true)
150
/// <param name="listenPorts">监听端口</param>
151
public CyberCommServer(bool autoReceiveCompletedMessage = true, params int[] listenPorts)
123
152
{
124
serverURL = $"http://*:{listenPort}/";
153
var serverURLs = new List<string>();
154
foreach (var port in listenPorts)
155
{
156
serverURLs.Add($"http://*:{port}/");
157
}
158
this.serverURLs = [.. serverURLs];
125
159
AutoReceiveCompletedMessage = autoReceiveCompletedMessage;
126
160
}
127
161
/// <summary>
128
162
/// CyberComm服务器,使用URL创建
129
163
/// </summary>
130
/// <param name="serverURL">服务器URL</param>
131
164
/// <param name="autoReceiveCompletedMessage">是否自动接收完整消息</param>
132
public CyberCommServer(string serverURL, bool autoReceiveCompletedMessage = true)
165
/// <param name="serverURLs">服务器URL</param>
166
public CyberCommServer(bool autoReceiveCompletedMessage = true, params string[] serverURLs)
133
167
{
134
this.serverURL = serverURL;
168
this.serverURLs = serverURLs;
135
169
AutoReceiveCompletedMessage = autoReceiveCompletedMessage;
136
170
}
137
171
#endregion
@@ -0,0 +1,94 @@
1
using System.Collections.Specialized;
2
using System.Net.WebSockets;
3
using System.Text;
4
5
namespace XFEExtension.NetCore.CyberComm;
6
7
/// <summary>
8
/// CyberComm服务器事件参数
9
/// </summary>
10
/// <param name="RequestURL">请求时的URL地址</param>
11
/// <param name="MessageType"> 消息类型 </param>
12
/// <param name="CurrentWebSocket"> 当前WebSocket </param>
13
/// <param name="WSHeader"> 客户端请求头 </param>
14
/// <param name="Exception"> 异常消息(如果有的话) </param>
15
/// <param name="IpAddress"> 客户端IP地址 </param>
16
/// <param name="TextMessage"> 文本消息 </param>
17
/// <param name="BinaryMessage"> 二进制消息 </param>
18
public abstract record CyberCommServerEventArgs(Uri? RequestURL, BackMessageType MessageType, WebSocket CurrentWebSocket, NameValueCollection WSHeader, XFECyberCommException? Exception, string IpAddress, string? TextMessage, byte[]? BinaryMessage)
19
{
20
/// <summary>
21
/// 发送文本消息
22
/// </summary>
23
/// <param name="message">待发送的文本</param>
24
/// <exception cref="XFECyberCommException"></exception>
25
/// <returns>发送进程</returns>
26
public async Task ReplyMessage(string message)
27
{
28
try
29
{
30
byte[] sendBuffer = Encoding.UTF8.GetBytes(message);
31
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
32
}
33
catch (Exception ex)
34
{
35
throw new XFECyberCommException("收到客户端数据后服务器端回复文本时出现异常", ex);
36
}
37
}
38
/// <summary>
39
/// 发送二进制消息
40
/// </summary>
41
/// <param name="bytes">二进制消息</param>
42
/// <exception cref="XFECyberCommException"></exception>
43
/// <returns></returns>
44
public async Task ReplyBinaryMessage(byte[] bytes)
45
{
46
try
47
{
48
await CurrentWebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Binary, true, CancellationToken.None);
49
}
50
catch (Exception ex)
51
{
52
throw new XFECyberCommException("收到客户端数据后服务器端回复二进制数据时出现异常", ex);
53
}
54
}
55
/// <summary>
56
/// 关闭连接
57
/// </summary>
58
/// <exception cref="XFECyberCommException"></exception>
59
public async Task Close()
60
{
61
try
62
{
63
await CurrentWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection Closed", CancellationToken.None);
64
}
65
catch (Exception ex)
66
{
67
throw new XFECyberCommException("关闭服务器端连接时出现异常", ex);
68
}
69
}
70
/// <summary>
71
/// 强制关闭连接
72
/// </summary>
73
/// <exception cref="XFECyberCommException"></exception>
74
public void ForceClose()
75
{
76
try
77
{
78
CurrentWebSocket.Abort();
79
}
80
catch (Exception ex)
81
{
82
throw new XFECyberCommException("强制关闭服务器端连接时出现异常", ex);
83
}
84
}
85
internal CyberCommServerEventArgs(Uri? requestURL, WebSocket webSocket, string message, string ipAddress, NameValueCollection wsHeader) : this(requestURL, BackMessageType.Text, webSocket, wsHeader, null, ipAddress, message, null)
86
{
87
}
88
internal CyberCommServerEventArgs(Uri? requestURL, WebSocket webSocket, byte[] bytes, string ipAddress, NameValueCollection wsHeader) : this(requestURL, BackMessageType.Binary, webSocket, wsHeader, null, ipAddress, null, bytes)
89
{
90
}
91
internal CyberCommServerEventArgs(Uri? requestURL, WebSocket webSocket, XFECyberCommException ex, string ipAddress, NameValueCollection wsHeader) : this(requestURL, BackMessageType.Error, webSocket, wsHeader, ex, ipAddress, null, null)
92
{
93
}
94
}
@@ -0,0 +1,11 @@
1
using System.Collections.Specialized;
2
using System.Net.WebSockets;
3
4
namespace XFEExtension.NetCore.CyberComm;
5
6
record class CyberCommServerEventArgsImpl : CyberCommServerEventArgs
7
{
8
internal CyberCommServerEventArgsImpl(Uri? requestURL, WebSocket webSocket, string message, string ipAddress, NameValueCollection wsHeader) : base(requestURL, webSocket, message, ipAddress, wsHeader) { }
9
internal CyberCommServerEventArgsImpl(Uri? requestURL, WebSocket webSocket, byte[] bytes, string ipAddress, NameValueCollection wsHeader) : base(requestURL, webSocket, bytes, ipAddress, wsHeader) { }
10
internal CyberCommServerEventArgsImpl(Uri? requestURL, WebSocket webSocket, XFECyberCommException ex, string ipAddress, NameValueCollection wsHeader) : base(requestURL, webSocket, ex, ipAddress, wsHeader) { }
11
}