XFEExtension
【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFE各类拓展/CyberComm.cs
+84
-18
XFEstudio/XFEExtension
更新了XCC网络通讯的协议,现在可识别文件格式,新增封装:发送音频
d85d541
代码差异
1 个文件
+84
-18
@@ -877,6 +877,14 @@ namespace XFE各类拓展.CyberComm
877
877
/// </summary>
878
878
Binary,
879
879
/// <summary>
880
/// 图片消息
881
/// </summary>
882
Image,
883
/// <summary>
884
/// 音频消息
885
/// </summary>
886
Audio,
887
/// <summary>
880
888
/// 错误消息
881
889
/// </summary>
882
890
Error
@@ -993,11 +1001,11 @@ namespace XFE各类拓展.CyberComm
993
1001
/// <summary>
994
1002
/// 启动XCC会话
995
1003
/// </summary>
996
/// <param name="AutoReconnect">是否自动重连</param>
997
/// <param name="ReconncetMaxTimes">最大重连次数,-1则为无限次</param>
998
/// <param name="ReconnectTryDelay">重连尝试延迟</param>
1004
/// <param name="autoReconnect">是否自动重连</param>
1005
/// <param name="reconnectMaxTimes">最大重连次数,-1则为无限次</param>
1006
/// <param name="reconnectTryDelay">重连尝试延迟</param>
999
1007
/// <returns></returns>
1000
public async void StartXCC(bool AutoReconnect = true, int ReconncetMaxTimes = -1, int ReconnectTryDelay = 100)
1008
public async void StartXCC(bool autoReconnect = true, int reconnectMaxTimes = -1, int reconnectTryDelay = 100)
1001
1009
{
1002
1010
XCCReconnect:
1003
1011
ClientWebSocket = new ClientWebSocket();
@@ -1016,11 +1024,11 @@ namespace XFE各类拓展.CyberComm
1016
1024
workBase.ConnectionClosed?.Invoke(this, new XCCConnectionClosedEventArgsImpl(this, ClientWebSocket, false));
1017
1025
}
1018
1026
IsConnected = false;
1019
if (AutoReconnect)
1027
if (autoReconnect)
1020
1028
{
1021
if (reconnectTimes <= ReconncetMaxTimes || ReconncetMaxTimes == -1)
1029
if (reconnectTimes <= reconnectMaxTimes || reconnectMaxTimes == -1)
1022
1030
{
1023
Thread.Sleep(ReconnectTryDelay);
1031
Thread.Sleep(reconnectTryDelay);
1024
1032
goto XCCReconnect;
1025
1033
}
1026
1034
}
@@ -1060,7 +1068,21 @@ namespace XFE各类拓展.CyberComm
1060
1068
receiveResult = await ClientWebSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
1061
1069
bufferList.AddRange(receiveBuffer.Take(receiveResult.Count));
1062
1070
}
1063
workBase.MessageReceived?.Invoke(this, new XCCMessageReceivedEventArgsImpl(this, ClientWebSocket, bufferList.ToArray()));
1071
var messageType = XCCMessageType.Binary;
1072
switch (bufferList[0])
1073
{
1074
case 0x01:
1075
messageType = XCCMessageType.Image;
1076
break;
1077
case 0x02:
1078
messageType = XCCMessageType.Audio;
1079
break;
1080
default:
1081
messageType = XCCMessageType.Binary;
1082
break;
1083
}
1084
bufferList.RemoveAt(0);
1085
workBase.MessageReceived?.Invoke(this, new XCCMessageReceivedEventArgsImpl(this, ClientWebSocket, bufferList.ToArray(), messageType, bufferList[0]));
1064
1086
}
1065
1087
}
1066
1088
catch (Exception ex)
@@ -1070,12 +1092,12 @@ namespace XFE各类拓展.CyberComm
1070
1092
workBase.ConnectionClosed?.Invoke(this, new XCCConnectionClosedEventArgsImpl(this, ClientWebSocket, false));
1071
1093
}
1072
1094
IsConnected = false;
1073
if (AutoReconnect)
1095
if (autoReconnect)
1074
1096
{
1075
if (AutoReconnect)
1097
if (autoReconnect)
1076
1098
{
1077
Thread.Sleep(ReconnectTryDelay);
1078
if (reconnectTimes <= ReconncetMaxTimes || ReconncetMaxTimes == -1)
1099
Thread.Sleep(reconnectTryDelay);
1100
if (reconnectTimes <= reconnectMaxTimes || reconnectMaxTimes == -1)
1079
1101
goto XCCReconnect;
1080
1102
}
1081
1103
}
@@ -1126,7 +1148,28 @@ namespace XFE各类拓展.CyberComm
1126
1148
}
1127
1149
}
1128
1150
/// <summary>
1129
/// 发送二进制消息
1151
/// 发送标准的二进制消息
1152
/// </summary>
1153
/// <param name="message">二进制消息</param>
1154
/// <param name="signature">标识</param>
1155
/// <returns></returns>
1156
/// <exception cref="XFECyberCommException"></exception>
1157
public async Task SendSignedBinaryMessage(byte[] message, byte signature)
1158
{
1159
try
1160
{
1161
byte[] sendBuffer = new byte[message.Length + 1];
1162
sendBuffer[0] = signature;
1163
message.CopyTo(sendBuffer, 1);
1164
await ClientWebSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Binary, true, CancellationToken.None);
1165
}
1166
catch (Exception ex)
1167
{
1168
throw new XFECyberCommException("客户端发送二进制数据到服务器时出现异常", ex);
1169
}
1170
}
1171
/// <summary>
1172
/// 发送默认标准的二进制消息
1130
1173
/// </summary>
1131
1174
/// <param name="message">待发送的二进制数据</param>
1132
1175
/// <exception cref="XFECyberCommException"></exception>
@@ -1135,7 +1178,7 @@ namespace XFE各类拓展.CyberComm
1135
1178
{
1136
1179
try
1137
1180
{
1138
await ClientWebSocket.SendAsync(new ArraySegment<byte>(message), WebSocketMessageType.Binary, true, CancellationToken.None);
1181
await SendSignedBinaryMessage(message, 0x00);
1139
1182
}
1140
1183
catch (Exception ex)
1141
1184
{
@@ -1152,7 +1195,7 @@ namespace XFE各类拓展.CyberComm
1152
1195
{
1153
1196
try
1154
1197
{
1155
await SendBinaryMessage(File.ReadAllBytes(filePath));
1198
await SendSignedBinaryMessage(File.ReadAllBytes(filePath), 0x01);
1156
1199
}
1157
1200
catch (Exception ex)
1158
1201
{
@@ -1160,6 +1203,23 @@ namespace XFE各类拓展.CyberComm
1160
1203
}
1161
1204
}
1162
1205
/// <summary>
1206
/// 发送音频
1207
/// </summary>
1208
/// <param name="buffer">二进制音频流</param>
1209
/// <returns></returns>
1210
/// <exception cref="XFECyberCommException"></exception>
1211
public async Task SendAudioBuffer(byte[] buffer)
1212
{
1213
try
1214
{
1215
await SendSignedBinaryMessage(buffer, 0x02);
1216
}
1217
catch (Exception ex)
1218
{
1219
throw new XFECyberCommException("客户端发送音频到服务器时出现异常", ex);
1220
}
1221
}
1222
/// <summary>
1163
1223
/// 获取历史记录
1164
1224
/// </summary>
1165
1225
/// <exception cref="XFECyberCommException"></exception>
@@ -1232,6 +1292,10 @@ namespace XFE各类拓展.CyberComm
1232
1292
/// </summary>
1233
1293
public string TextMessage { get; }
1234
1294
/// <summary>
1295
/// 消息签名
1296
/// </summary>
1297
public byte Signature { get; }
1298
/// <summary>
1235
1299
/// 触发事件的群组
1236
1300
/// </summary>
1237
1301
public XCCGroup Group { get; }
@@ -1276,14 +1340,16 @@ namespace XFE各类拓展.CyberComm
1276
1340
CurrentWebSocket = clientWebSocket;
1277
1341
TextMessage = message;
1278
1342
Group = group;
1343
Signature = 0x00;
1279
1344
MessageType = XCCMessageType.Text;
1280
1345
}
1281
internal XCCMessageReceivedEventArgs(XCCGroup group, ClientWebSocket clientWebSocket, byte[] bytes)
1346
internal XCCMessageReceivedEventArgs(XCCGroup group, ClientWebSocket clientWebSocket, byte[] bytes, XCCMessageType messageType, byte signature)
1282
1347
{
1283
1348
CurrentWebSocket = clientWebSocket;
1284
1349
BinaryMessage = bytes;
1285
1350
Group = group;
1286
MessageType = XCCMessageType.Binary;
1351
Signature = signature;
1352
MessageType = messageType;
1287
1353
}
1288
1354
internal XCCMessageReceivedEventArgs(XCCGroup group, ClientWebSocket clientWebSocket, XFECyberCommException ex)
1289
1355
{
@@ -1342,7 +1408,7 @@ namespace XFE各类拓展.CyberComm
1342
1408
class XCCMessageReceivedEventArgsImpl : XCCMessageReceivedEventArgs
1343
1409
{
1344
1410
internal XCCMessageReceivedEventArgsImpl(XCCGroup group, ClientWebSocket clientWebSocket, string message) : base(group, clientWebSocket, message) { }
1345
internal XCCMessageReceivedEventArgsImpl(XCCGroup group, ClientWebSocket clientWebSocket, byte[] bytes) : base(group, clientWebSocket, bytes) { }
1411
internal XCCMessageReceivedEventArgsImpl(XCCGroup group, ClientWebSocket clientWebSocket, byte[] bytes, XCCMessageType messageType, byte signature) : base(group, clientWebSocket, bytes, messageType, signature) { }
1346
1412
internal XCCMessageReceivedEventArgsImpl(XCCGroup group, ClientWebSocket clientWebSocket, XFECyberCommException ex) : base(group, clientWebSocket, ex) { }
1347
1413
}
1348
1414
class XCCConnectionClosedEventArgsImpl : XCCConnectionClosedEventArgs