using System.Net.WebSockets;
using System.Text;
using XFEExtension.NetCore.Exceptions;
namespace XFEExtension.NetCore.CyberComm.XCCNetWork;
///
/// XCC网络通讯事件
///
public abstract class XCCMessageReceivedEventArgs : EventArgs
{
///
/// 触发事件的群组
///
public XCCGroup Group { get; }
///
/// WebSocket明文传输客户端
///
public ClientWebSocket? TextMessageClientWebSocket { get; private set; }
///
/// WebSocket文件传输客户端
///
public ClientWebSocket? FileTransportClientWebSocket { get; private set; }
///
/// XCC服务器连接类型
///
public XCCClientType XCCClientType { get; }
///
/// 消息ID
///
public string? MessageId { get; }
///
/// 群组ID
///
public string GroupId
{
get
{
return Group.GroupId;
}
}
///
/// 发送者
///
public string? Sender { get; }
///
/// 回复文本消息
///
/// 待发送的文本
/// 发送进程
public async Task ReplyTextMessage(string message)
{
try
{
var sendBuffer = Encoding.UTF8.GetBytes(message);
await TextMessageClientWebSocket!.SendAsync(new ArraySegment(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
}
catch (Exception ex)
{
throw new XFECyberCommException("收到服务器端数据后客户端回复文本数据时出现异常", ex);
}
}
///
/// 回复二进制消息
///
/// 二进制消息
///
public async Task ReplyBinaryMessage(byte[] message)
{
try
{
await FileTransportClientWebSocket!.SendAsync(new ArraySegment(message), WebSocketMessageType.Binary, true, CancellationToken.None);
}
catch (Exception ex)
{
throw new XFECyberCommException("收到服务器端数据后客户端回复文本数据时出现异常", ex);
}
}
///
/// 关闭连接
///
///
public async Task Close()
{
try
{
if (TextMessageClientWebSocket?.State == WebSocketState.Open)
await TextMessageClientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭连接", CancellationToken.None);
if (FileTransportClientWebSocket?.State == WebSocketState.Open)
await FileTransportClientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭连接", CancellationToken.None);
}
catch (Exception ex)
{
throw new XFECyberCommException("客户端关闭连接时出现异常", ex);
}
}
internal XCCMessageReceivedEventArgs(XCCGroup group, ClientWebSocket? textMessageClientWebSocket, ClientWebSocket? fileTransportClientWebSocket, XCCClientType xCCClientType, string? sender, string? messageId)
{
Group = group;
TextMessageClientWebSocket = textMessageClientWebSocket;
FileTransportClientWebSocket = fileTransportClientWebSocket;
XCCClientType = xCCClientType;
Sender = sender;
MessageId = messageId;
}
}