216 lines
4.5 KiB
C#
216 lines
4.5 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 TcpClient TcpClient;
|
|
private readonly string Ip;
|
|
private readonly int Port;
|
|
private Thread HeartThread;
|
|
private bool IsRetrying;
|
|
|
|
public ClientService()
|
|
{
|
|
var serviceAddressInfo = ConfigurationManager.AppSettings["ServiceAddressInfo"].Split(':');
|
|
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()
|
|
{
|
|
StartNewEasyClient();
|
|
DoHeart();
|
|
}
|
|
|
|
private void DoDebug()
|
|
{
|
|
for (var i = 0; i < 5; i++)
|
|
{
|
|
Thread t = new Thread(() =>
|
|
{
|
|
while (true)
|
|
{
|
|
var r = GetRegisterEntity();
|
|
r.Head.Type = 4;
|
|
r.Data = new byte[100 * 1024 * 1024];
|
|
Send(r.ToByte());
|
|
Thread.Sleep(100);
|
|
}
|
|
});
|
|
t.Start();
|
|
}
|
|
}
|
|
|
|
private void StartNewEasyClient()
|
|
{
|
|
TcpClient = new TcpClient(Ip, Port, OnDataGeted, OnConnected, OnClosed, OnError);
|
|
}
|
|
|
|
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;
|
|
}
|
|
else
|
|
{
|
|
if (transInfo.TransResultInfo != null && !String.IsNullOrWhiteSpace(transInfo.TransResultInfo.Message))
|
|
{
|
|
_LogHelper.Error("发生错误:" + transInfo.TransResultInfo.Message);
|
|
}
|
|
}
|
|
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 OnConnected(object sender, EventArgs e)
|
|
{
|
|
IsRetrying = false;
|
|
_LogHelper.Info("连接成功");
|
|
Send(GetRegisterEntity().ToByte());
|
|
}
|
|
|
|
private void OnClosed(object sender, EventArgs e)
|
|
{
|
|
_LogHelper.Info("EasyClient.OnClosed");
|
|
ReStart();
|
|
}
|
|
|
|
private void OnError(object sender, EventArgs e)
|
|
{
|
|
_LogHelper.Info("连接出错,原因为:" + ((ErrorEventArgs)e).Exception.Message);
|
|
ReStart();
|
|
}
|
|
|
|
private void ReStart()
|
|
{
|
|
Thread.Sleep(5000);
|
|
StartNewEasyClient();
|
|
}
|
|
|
|
|
|
|
|
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 > 10)
|
|
{
|
|
_LogHelper.Error("超过一分钟没收到心跳包的反馈信息");
|
|
TcpClient.HeartLost();
|
|
}
|
|
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 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;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
TcpClient.Dispose();
|
|
}
|
|
}
|
|
}
|