XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension

fix-修复原本的CyberCommServer中的一些错误 add-CyberCommServer现支持Http请求

e5a6861
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

8 个文件 +315 -241
Modified XFEExtension.NetCore/CyberComm/CyberCommClient.cs +2 -218
@@ -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 }
Added XFEExtension.NetCore/CyberComm/CyberCommClientEventArgs.cs +58 -0
@@ -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 }
Added XFEExtension.NetCore/CyberComm/CyberCommClientEventArgsImpl.cs +10 -0
@@ -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 }
Added XFEExtension.NetCore/CyberComm/CyberCommRequestEventArgs.cs +72 -0
@@ -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 }
Added XFEExtension.NetCore/CyberComm/CyberCommRequestEventArgsImpl.cs +11 -0
@@ -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 }
Modified XFEExtension.NetCore/CyberComm/CyberCommServer.cs +57 -23
@@ -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
Added XFEExtension.NetCore/CyberComm/CyberCommServerEventArgs.cs +94 -0
@@ -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 }
Added XFEExtension.NetCore/CyberComm/CyberCommServerEventArgsImpl.cs +11 -0
@@ -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 }