init commit all code

This commit is contained in:
路 范
2021-12-20 17:17:49 +08:00
parent 66d48149a6
commit f60ad763ed
1325 changed files with 1744918 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ServiceAddressInfo" value="127.0.0.1:8888" />
<add key="HandlerClassInfo" value="" />
<add key="AppName" value="Xzsp" />
</appSettings>
</configuration>

View File

@@ -0,0 +1,198 @@
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();
}
}
}

View File

@@ -0,0 +1,215 @@
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();
}
}
}

View File

@@ -0,0 +1,76 @@
using Newtonsoft.Json;
using SuperSocket.ProtoBase;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Entities
{
public class ReceiveFilter : FixedHeaderReceiveFilter<TransInfo>
{
public ReceiveFilter() : base(10)
{
}
protected override int GetBodyLengthFromHeader(IBufferStream bufferStream, int length)
{
bufferStream.ReadInt16();
var len = GetStrLength(bufferStream) + GetDataLength(bufferStream);
return len;
}
public override TransInfo ResolvePackage(IBufferStream bufferStream)
{
((Stream)bufferStream).Position = 2;
var strLength = GetStrLength(bufferStream);
var dataLength = GetDataLength(bufferStream);
var allLength = strLength + dataLength;
byte[] buffer = new byte[strLength];
bufferStream.Read(buffer, 0, strLength);
var json = Encoding.UTF8.GetString(buffer);
var r = JsonConvert.DeserializeObject<TransInfo>(json);
if (r == null)
{
return new TransInfo();
}
buffer = new byte[dataLength];
bufferStream.Read(buffer, 0, dataLength);
r.Data = buffer;
return r;
}
/*protected override TransInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
{
var strLength = BitConverter.ToInt32(header.Array, header.Offset + 2);
var dataLength = BitConverter.ToInt32(header.Array, header.Offset + 6);
var json = Encoding.UTF8.GetString(bodyBuffer.Skip(offset).Take(strLength).ToArray());
var r = JsonConvert.DeserializeObject<TransInfo>(json);
r.Data = bodyBuffer.Skip(offset + strLength).Take(dataLength).ToArray();
return r;
}*/
private int GetStrLength(IBufferStream bufferStream)
{
byte[] buffer = new byte[4];
bufferStream.Read(buffer, 0, 4);
var r = BitConverter.ToInt32(buffer, 0);
return r;
}
private int GetDataLength(IBufferStream bufferStream)
{
byte[] buffer = new byte[4];
bufferStream.Read(buffer, 0, 4);
var r = BitConverter.ToInt32(buffer, 0);
return r;
}
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Entities
{
public class TransBody
{
public string TargetAppID { get; set; }
public string AppID { get; set; }
public string AppSecret { get; set; }
public string Action { get; set; }
public string Param { get; set; }
public string Key { get; set; }
public string Url { get; set; }
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Entities
{
public class TransHead
{
public string AppID { get; set; }
public string AppSecret { get; set; }
/// <summary>
/// 1 注册 2 请求
/// </summary>
public int Type { get; set; }
public string Param { get; set; }
public string ServiceSecret { get; set; }
public long TimeStamp { get; set; }
public string Sign { get; set; }
}
}

View File

@@ -0,0 +1,53 @@
using Newtonsoft.Json;
using SuperSocket.ProtoBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Entities
{
public class TransInfo : IPackageInfo
{
public TransHead Head { get; set; }
public TransBody Body { get; set; }
public TransResult TransResultInfo { get; set; }
[JsonIgnore]
public byte[] Data { get; set; }
public static TransInfo Parse(byte[] buffer)
{
var strlength = BitConverter.ToInt32(buffer, 2);
var byteLength = BitConverter.ToInt32(buffer, 6);
var json = Encoding.UTF8.GetString(buffer.Skip(10).Take(strlength).ToArray());
if (json == String.Empty)
{
return null;
}
var r = JsonConvert.DeserializeObject<TransInfo>(json);
r.Data = buffer.Skip(10 + strlength).Take(byteLength).ToArray();
return r;
}
public byte[] ToByte()
{
List<byte> bufferHead = new List<byte>();
bufferHead.AddRange(Encoding.UTF8.GetBytes("@@"));
List<byte> bufferBody = new List<byte>();
var json = JsonConvert.SerializeObject(this);
bufferBody.AddRange(Encoding.UTF8.GetBytes(json));
var strLength = bufferBody.Count;
if (Data != null)
{
bufferBody.AddRange(Data);
}
bufferHead.AddRange(BitConverter.GetBytes(strLength));
bufferHead.AddRange(BitConverter.GetBytes(Data == null ? 0 : Data.Length));
bufferHead.AddRange(bufferBody);
return bufferHead.ToArray();
}
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Entities
{
public class TransResult
{
public string Key { get; set; }
public int Code { get; set; }
public string Message { get; set; }
public byte[] Data { get; set; }
}
}

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{41181ED6-F47D-485E-A8F1-B2BDB52DC902}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Getf.Service.Transfer.Client.WinService</RootNamespace>
<AssemblyName>Getf.Service.Transfer.Client.WinService</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SuperSocket.ClientEngine, Version=0.10.0.0, Culture=neutral, PublicKeyToken=ee9af13f57f00acc, processorArchitecture=MSIL">
<HintPath>..\packages\SuperSocket.ClientEngine.0.10.0\lib\net40-client\SuperSocket.ClientEngine.dll</HintPath>
</Reference>
<Reference Include="SuperSocket.ProtoBase, Version=1.7.0.17, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
<HintPath>..\packages\SuperSocket.ProtoBase.1.7.0.17\lib\net40\SuperSocket.ProtoBase.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ClientService.cs" />
<Compile Include="Entities\ReceiveFilter.cs" />
<Compile Include="Entities\TransBody.cs" />
<Compile Include="Entities\TransHead.cs" />
<Compile Include="Entities\TransInfo.cs" />
<Compile Include="Entities\TransResult.cs" />
<Compile Include="Helpers\LogHelper.cs" />
<Compile Include="Helpers\Md5Helper.cs" />
<Compile Include="Helpers\TypeHelper.cs" />
<Compile Include="IDataHandler.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TcpClient.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Helpers
{
public class LogHelper
{
log4net.ILog MLog;
public LogHelper()
{
MLog = log4net.LogManager.GetLogger("Getf.Transfer.Client");
}
public void Debug(string msg)
{
MLog.Debug(msg);
}
public void Error(string msg)
{
MLog.Error(msg);
}
public void Error(Exception exception)
{
MLog.Error(exception.Message, exception);
}
public void Info(string msg)
{
MLog.Info(msg);
}
public void Warn(string msg)
{
MLog.Warn(msg);
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Helpers
{
public static class Md5Helper
{
public static string Md5(string str)
{
MD5 md5 = MD5.Create();
byte[] data = Encoding.UTF8.GetBytes(str);
data = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.Append(data[i].ToString("x2"));
}
return sb.ToString();
}
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService.Helpers
{
public static class TypeHelper
{
public static DateTime ToDateTime(long timeStamp)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
DateTime dt = startTime.AddSeconds(timeStamp);
return dt;
}
public static long GetTimeStamp()
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
long t = (long)(DateTime.Now - startTime).TotalSeconds;
return t;
}
}
}

View File

@@ -0,0 +1,13 @@
using Getf.Service.Transfer.Client.WinService.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Getf.Service.Transfer.Client.WinService
{
public interface IDataHandler
{
TransInfo HandlerData(TransInfo srcData);
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Getf.Service.Transfer.Client.WinService")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Hewlett-Packard")]
[assembly: AssemblyProduct("Getf.Service.Transfer.Client.WinService")]
[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("41181ed6-f47d-485e-a8f1-b2bdb52dc902")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,62 @@
using Getf.Service.Transfer.Client.WinService.Entities;
using SuperSocket.ClientEngine;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
namespace Getf.Service.Transfer.Client.WinService
{
public class TcpClient : IDisposable
{
//private Thread SendHeartThread;
string Ip { get; set; }
int Port { get; set; }
EasyClient EasyClient;
bool IsHeartLosted = false;
Action<object, EventArgs> OnClosed;
public bool IsConnected { get { return EasyClient.IsConnected; } }
public TcpClient(string ip, int port, Action<TransInfo> onDataGeted, Action<object, EventArgs> onConnected, Action<object, EventArgs> onClosed, Action<object, EventArgs> onError)
{
Ip = ip;
Port = port;
EasyClient = new EasyClient();
EasyClient.Initialize(new ReceiveFilter(), onDataGeted);
EasyClient.Connected += new EventHandler(onConnected);
EasyClient.Closed += EasyClient_Closed;
EasyClient.Error += new EventHandler<ErrorEventArgs>(onError);
EasyClient.ConnectAsync(new IPEndPoint(IPAddress.Parse(Ip), Port));
OnClosed = onClosed;
//SendHeartThread = new Thread();
}
public void Send(byte[] data)
{
EasyClient.Send(data);
}
private void EasyClient_Closed(object sender, EventArgs e)
{
if (IsHeartLosted) return;
OnClosed?.Invoke(sender, e);
}
public void HeartLost()
{
//IsHeartLosted = true;
EasyClient.Close();
}
public void Dispose()
{
HeartLost();
//SendHeartThread.Abort();
}
}
}

View File

@@ -0,0 +1,207 @@
using Getf.Service.Transfer.Client.WinService.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Getf.Service.Transfer.Client.WinService
{
public class TcpClientService : IDisposable
{
private Socket _SocketClient;
private readonly string _IP;
private readonly int _Port;
public event Action<TcpClientService> OnError;
public event Action<TcpClientService> OnConnected;
public event Action<TcpClientService, byte[]> OnDataGeted;
private byte[] _Buffer;
public bool IsConnected = false;
bool IsDisposed = false;
LogHelper _LogHelper;
public TcpClientService(string ip, int port)
{
_IP = ip;
_Port = port;
_LogHelper = new LogHelper();
_Buffer = new byte[100 * 1024 * 1024];
}
public void Connect()
{
if (_SocketClient != null)
{
return;
}
_SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_SocketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
IPAddress ipAddress = IPAddress.Parse(_IP);
var endPoint = new IPEndPoint(ipAddress, _Port);
_LogHelper.Debug("开始连接");
_SocketClient.BeginConnect(endPoint, new AsyncCallback(Connected), null);
}
private void Connected(IAsyncResult asyncResult)
{
try
{
_SocketClient.EndConnect(asyncResult);
_LogHelper.Debug("连接成功");
IsConnected = true;
TriggerConnected();
}
catch (Exception e)
{
_LogHelper.Error("连接失败原因为:" + e.Message);
TriggerError();
}
}
public void ReceiveLoop()
{
Thread thread = new Thread(() =>
{
while (!IsDisposed)
{
Receive();
}
});
thread.Start();
}
public void Receive()
{
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
_LogHelper.Debug("开始监听接收数据");
try
{
_SocketClient.BeginReceive(_Buffer, 0, _Buffer.Length, SocketFlags.None, new AsyncCallback(Received), new object[] { manualResetEvent, _Buffer });
}
catch (Exception e)
{
_LogHelper.Error("接收数据失败原因为:" + e.Message);
Thread.Sleep(100000);
manualResetEvent.Set();
}
manualResetEvent.WaitOne();
manualResetEvent.Dispose();
}
private void Received(IAsyncResult asyncResult)
{
if (IsDisposed)
{
return;
}
var objs = asyncResult.AsyncState as object[];
var manualResetEvent = objs[0] as ManualResetEvent;
var buffer = objs[1] as byte[];
try
{
var length = _SocketClient.EndReceive(asyncResult);
_LogHelper.Debug("接收到服务器推送的数据");
TriggerDataGeted(buffer);
if (buffer != null)
{
Array.Clear(buffer, 0, length);
}
}
catch (Exception e)
{
_LogHelper.Error("接收到服务器推送的数据失败原因为:" + e.Message);
TriggerError();
}
manualResetEvent.Set();
}
public void Send(byte[] buffer)
{
_LogHelper.Debug("开始发送数据");
try
{
_SocketClient.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Sended), null);
}
catch (Exception e)
{
_LogHelper.Error("发送数据失败原因为:" + e.Message);
TriggerError();
}
}
private void Sended(IAsyncResult asyncResult)
{
if (IsDisposed)
{
return;
}
try
{
_SocketClient.EndSend(asyncResult);
_LogHelper.Debug("发送数据成功");
}
catch (Exception e)
{
_LogHelper.Error("发送数据失败原因为:" + e.Message);
TriggerError();
}
}
private void TriggerError()
{
IsConnected = false;
if (OnError != null)
{
OnError(this);
}
}
private void TriggerConnected()
{
if (OnConnected != null)
{
OnConnected(this);
}
}
private void TriggerDataGeted(byte[] buffer)
{
if (OnDataGeted != null)
{
OnDataGeted(this, buffer);
}
}
public void Dispose()
{
IsDisposed = true;
try
{
_Buffer = null;
if (_SocketClient != null)
{
try
{
_SocketClient.Disconnect(false);
}
catch
{
}
_SocketClient.Dispose();
}
}
catch
{
}
}
}
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ServiceAddressInfo" value="127.0.0.1:8888" />
<add key="HandlerClassInfo" value="" />
<add key="AppName" value="Xzsp" />
</appSettings>
</configuration>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]

View File

@@ -0,0 +1,32 @@
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.dll.config
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.pdb
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\log4net.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ClientEngine.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ProtoBase.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\log4net.xml
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.pdb
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.xml
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ProtoBase.xml
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.AssemblyReference.cache
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.CoreCompileInputs.cache
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.CopyComplete
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.dll
D:\WORK\C宁波拆迁\transfer\Services\Getf.Service.Transfer\Src\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.pdb
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.dll.config
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Getf.Service.Transfer.Client.WinService.pdb
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\log4net.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ClientEngine.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ProtoBase.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\log4net.xml
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.pdb
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\Newtonsoft.Json.xml
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\bin\Debug\SuperSocket.ProtoBase.xml
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.AssemblyReference.cache
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.CoreCompileInputs.cache
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.csproj.CopyComplete
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.dll
D:\WORK\C宁波拆迁\neiwai_transfer\93_nei\Getf.Service.Transfer.Client.WinService\obj\Debug\Getf.Service.Transfer.Client.WinService.pdb

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="log4net" version="2.0.8" targetFramework="net40" />
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net40" />
<package id="SuperSocket.ClientEngine" version="0.10.0" targetFramework="net40" />
<package id="SuperSocket.ProtoBase" version="1.7.0.17" targetFramework="net40" />
</packages>