using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Serein.Library.Network.WebSocketCommunication; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace Serein.Library.Utils { /// /// 管理远程环境,具备连接、发送消息、停止的功能 /// public class RemoteMsgUtil { /// /// 远程环境配置 /// public class ControlConfiguration { /// /// 远程环境的网络地址 /// public string Addres { get; set; } /// /// 远程环境的对外端口 /// public int Port { get; set; } /// /// 登录远程环境必须携带的token(可以为可序列化的JSON对象) /// public object Token { get; set; } /// /// 有关消息ID的 Json Key /// public string MsgIdJsonKey { get; set; } /// /// 有关消息主题的 Json Key /// public string ThemeJsonKey { get; set; } /// /// 有关数据的 Json Key /// public string DataJsonKey { get; set; } } /// /// 配置远程连接IP端口 /// public RemoteMsgUtil(ControlConfiguration controlConfiguration) { Config = controlConfiguration; } /// /// 配置信息 /// public ControlConfiguration Config { get; } /// /// 连接到远程的客户端 /// public WebSocketClient EnvClient { get; } = new WebSocketClient(); /// /// 是否连接到了远程环境 /// //public bool IsConnectdRemoteEnv { get => isConnectdRemoteEnv; } //private bool isConnectdRemoteEnv = false; /// /// 尝试连接到远程环境 /// /// public async Task ConnectAsync() { // 第2种,WebSocket连接到远程环境,实时接收远程环境的响应? SereinEnv.WriteLine(InfoType.INFO, $"准备连接:{Config.Addres}:{Config.Port},{Config.Token}"); bool success = false; try { var tcpClient = new TcpClient(); var result = tcpClient.BeginConnect(Config.Addres, Config.Port, null, null); success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(3)); } finally { } if (!success) { SereinEnv.WriteLine(InfoType.ERROR, $"无法连通远程端口 {Config.Addres}:{Config.Port}"); return false; } else { var url = $"ws://{Config.Addres}:{Config.Port}/"; var result = await EnvClient.ConnectAsync(url); // 尝试连接远程环境 //this.isConnectdRemoteEnv = result; return result; } } /// /// 发送消息 /// /// /// /// /// public async Task SendAsync(string msgId , string theme, object data) { JObject jsonData; if (data is null) { jsonData = new JObject() { [Config.MsgIdJsonKey] = msgId, [Config.ThemeJsonKey] = theme, }; } else { JToken dataToken; if (data is System.Collections.IEnumerable || data is Array) { dataToken = JArray.FromObject(data); } else { dataToken = JObject.FromObject(data); } jsonData = new JObject() { [Config.MsgIdJsonKey] = msgId, [Config.ThemeJsonKey] = theme, [Config.DataJsonKey] = dataToken }; } var msg = jsonData.ToString(); await EnvClient.SendAsync(msg); } } }