Files
2021-12-20 17:17:49 +08:00

199 lines
4.2 KiB
C#

using Getf.Service.Transfer.Client.WinService.Entities;
using Getf.Service.Transfer.Client.WinService.Helpers;
using Newtonsoft.Json;
using SuperSocket.ClientEngine;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using System.Threading;
namespace Getf.Service.Transfer.Client.WinService
{
public class ClientService : IDisposable
{
LogHelper _LogHelper;
private DateTime LastRecvTime = DateTime.Now;
private readonly IDataHandler DataHandler;
private readonly EasyClient TcpClient;
private readonly string Ip;
private readonly int Port;
private Thread HeartThread;
private bool IsRetrying;
public ClientService()
{
var serviceAddressInfo = ConfigurationManager.AppSettings["ServiceAddressInfo"].Split(':');
TcpClient = new EasyClient();
Ip = serviceAddressInfo[0];
Port = int.Parse(serviceAddressInfo[1]);
var assemblyInfo = System.Configuration.ConfigurationManager.AppSettings["DataHandlerClassInfo"].Split(',');
DataHandler = Assembly.Load(assemblyInfo[1]).CreateInstance(assemblyInfo[0]) as IDataHandler;
_LogHelper = new LogHelper();
}
public void Start()
{
TcpClient.Initialize(new ReceiveFilter(), OnDataGeted);
TcpClient.Connected += OnConnected;
//TcpClient.Closed += Reconnect;
TcpClient.Error += Error;
Connect();
DoHeart();
}
private void DoHeart()
{
#if DEBUG
/*for (int i = 0; i < 100; i++)
{
var testThread = new Thread(() =>
{
while (true)
{
SendHeart();
}
});
testThread.Start();
}*/
#endif
HeartThread = new Thread(() =>
{
while (true)
{
if ((DateTime.Now - LastRecvTime).TotalMinutes > 5)
{
_LogHelper.Error("超过一分钟没收到心跳包的反馈信息");
Reconnect(null, null);
}
if (TcpClient.IsConnected)
{
SendHeart();
}
Thread.Sleep(5 * 1000);
}
});
HeartThread.Start();
}
private void SendHeart()
{
var r = GetRegisterEntity();
r.Head.Type = 4;
Send(r.ToByte());
}
private void OnConnected(object sender, EventArgs e)
{
IsRetrying = false;
_LogHelper.Info("连接成功");
Send(GetRegisterEntity().ToByte());
}
private void Error(object sender, EventArgs e)
{
_LogHelper.Info("连接出错,原因为:" + ((ErrorEventArgs)e).Exception.Message);
Reconnect(sender, e);
}
private void Reconnect(object sender, EventArgs e)
{
LastRecvTime = DateTime.Now;
CloseConnect();
Thread.Sleep(5000);
if (IsRetrying) return;
IsRetrying = true;
Connect();
}
private void Connect()
{
TcpClient.ConnectAsync(new IPEndPoint(IPAddress.Parse(Ip), Port));
}
private void OnDataGeted(TransInfo transInfo)
{
LastRecvTime = DateTime.Now;
if (transInfo.Body == null)//心跳包
{
/*//应用已被注册 再试
if (transInfo.TransResultInfo != null && transInfo.TransResultInfo.Code == -210)
{
Reconnect(null, null);
}*/
if (transInfo.TransResultInfo != null && transInfo.TransResultInfo.Message == "注册成功!")
{
_LogHelper.Info("注册成功");
return;
}
return;
}
var transResult = DataHandler.HandlerData(transInfo);
var r = GetRegisterEntity();
r.Body = new TransBody()
{
Key = transInfo.Body.Key
};
r.Head.Type = 3;
r.TransResultInfo = transResult.TransResultInfo;
r.Data = transResult.Data;
Send(r.ToByte());
}
private void Send(byte[] data)
{
if (!TcpClient.IsConnected) return;
try
{
TcpClient.Send(data);
}
catch (Exception e)
{
_LogHelper.Error("发送错误原因为:" + e.Message);
}
}
private TransInfo GetRegisterEntity()
{
var ts = TypeHelper.GetTimeStamp();
var r = new TransInfo()
{
Head = new TransHead()
{
Type = 1,
AppID = ConfigurationManager.AppSettings["AppID"],
AppSecret = ConfigurationManager.AppSettings["AppSecret"],
TimeStamp = ts,
Sign = Md5Helper.Md5(ts + ConfigurationManager.AppSettings["Key"])
}
};
return r;
}
private void CloseConnect()
{
_LogHelper.Info("正在关闭连接");
TcpClient.Close();
}
public void Dispose()
{
CloseConnect();
}
}
}