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 RemoteEnvControl
{
///
/// 远程环境配置
///
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 RemoteEnvControl(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连接到远程环境,实时接收远程环境的响应?
Console.WriteLine($"准备连接:{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)
{
Console.WriteLine($"无法连通远程端口 {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)
{
//var sendMsg = new
//{
// theme = theme,
// token = this.Token,
// data = data,
//};
//var msg = JsonConvert.SerializeObject(sendMsg);
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();
//Console.WriteLine(msg);
//Console.WriteLine();
await EnvClient.SendAsync(msg);
}
}
}