using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using HslCommunication.Core;
using HslCommunication.Core.Net;
namespace HslCommunication.Enthernet
{
///
/// 文件传输客户端基类,提供上传,下载,删除的基础服务
///
public abstract class FileClientBase : NetworkXBase
{
#region Private Member
private IPEndPoint m_ipEndPoint = null;
#endregion
#region Public Member
///
/// 服务器端的文件管理引擎终结点
///
public IPEndPoint ServerIpEndPoint
{
get { return m_ipEndPoint; }
set { m_ipEndPoint = value; }
}
///
/// 获取或设置连接的超时时间,默认10秒
///
public int ConnectTimeOut { get; set; } = 10000;
#endregion
#region Private Method
///
/// 发送三个文件分类到服务器端
///
/// 套接字对象
/// 一级分类
/// 二级分类
/// 三级分类
/// 是否成功的结果对象
protected OperateResult SendFactoryGroupId(
Socket socket,
string factory,
string group,
string id
)
{
OperateResult factoryResult = SendStringAndCheckReceive( socket, 1, factory );
if (!factoryResult.IsSuccess)
{
return factoryResult;
}
OperateResult groupResult = SendStringAndCheckReceive( socket, 2, group );
if (!groupResult.IsSuccess)
{
return groupResult;
}
OperateResult idResult = SendStringAndCheckReceive( socket, 3, id );
if (!idResult.IsSuccess)
{
return idResult;
}
return OperateResult.CreateSuccessResult( ); ;
}
#endregion
#region Delete File
///
/// 删除服务器上的文件
///
/// 文件的名称
/// 一级分类
/// 二级分类
/// 三级分类
/// 是否成功的结果对象
protected OperateResult DeleteFileBase( string fileName, string factory, string group, string id )
{
// connect server
OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
if (!socketResult.IsSuccess) return socketResult;
// 发送操作指令
OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDelete, fileName );
if (!sendString.IsSuccess) return sendString;
// 发送文件名以及三级分类信息
OperateResult sendFileInfo = SendFactoryGroupId( socketResult.Content, factory, group, id );
if (!sendFileInfo.IsSuccess) return sendFileInfo;
// 接收服务器操作结果
OperateResult receiveBack = ReceiveStringContentFromSocket( socketResult.Content );
if (!receiveBack.IsSuccess) return receiveBack;
OperateResult result = new OperateResult( );
if (receiveBack.Content1 == 1) result.IsSuccess = true;
result.Message = receiveBack.Message;
socketResult.Content?.Close( );
return result;
}
#endregion
#region Download File
///
/// 基础下载信息
///
/// 一级分类
/// 二级分类
/// 三级分类
/// 服务器的文件名称
/// 下载的进度报告
/// 数据源信息,决定最终存储到哪里去
/// 是否成功的结果对象
protected OperateResult DownloadFileBase(
string factory,
string group,
string id,
string fileName,
Action processReport,
object source
)
{
// connect server
OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
if (!socketResult.IsSuccess) return socketResult;
// 发送操作指令
OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileDownload, fileName );
if (!sendString.IsSuccess) return sendString;
// 发送三级分类
OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id );
if (!sendClass.IsSuccess) return sendClass;
// 根据数据源分析
if (source is string fileSaveName)
{
OperateResult result = ReceiveFileFromSocket( socketResult.Content, fileSaveName, processReport );
if (!result.IsSuccess) return result;
}
else if (source is Stream stream)
{
OperateResult result = ReceiveFileFromSocket( socketResult.Content, stream, processReport );
if (!result.IsSuccess)
{
return result;
}
}
else
{
socketResult.Content?.Close( );
LogNet?.WriteError( ToString(), StringResources.Language.NotSupportedDataType );
return new OperateResult( StringResources.Language.NotSupportedDataType );
}
socketResult.Content?.Close( );
return OperateResult.CreateSuccessResult( );
}
#endregion
#region Upload File
///
/// 上传文件给服务器
///
/// 数据源,可以是文件名,也可以是数据流
/// 在服务器保存的文件名,不包含驱动器路径
/// 一级分类
/// 二级分类
/// 三级分类
/// 文件的描述
/// 文件的上传人
/// 汇报进度
/// 是否成功的结果对象
protected OperateResult UploadFileBase(
object source,
string serverName,
string factory,
string group,
string id,
string fileTag,
string fileUpload,
Action processReport )
{
// HslReadWriteLock readWriteLock = new HslReadWriteLock( );
// 创建套接字并连接服务器
OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
if (!socketResult.IsSuccess) return socketResult;
// 上传操作暗号的文件名
OperateResult sendString = SendStringAndCheckReceive( socketResult.Content, HslProtocol.ProtocolFileUpload, serverName );
if (!sendString.IsSuccess) return sendString;
// 发送三级分类
OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id );
if (!sendClass.IsSuccess) return sendClass;
// 判断数据源格式
if (source is string fileName)
{
OperateResult result = SendFileAndCheckReceive( socketResult.Content, fileName, serverName, fileTag, fileUpload, processReport );
if(!result.IsSuccess)
{
return result;
}
}
else if (source is Stream stream)
{
OperateResult result = SendFileAndCheckReceive( socketResult.Content, stream, serverName, fileTag, fileUpload, processReport );
if (!result.IsSuccess)
{
return result;
}
}
else
{
socketResult.Content?.Close( );
LogNet?.WriteError( ToString( ), StringResources.Language.DataSourseFormatError );
return new OperateResult( StringResources.Language.DataSourseFormatError );
}
// 确认服务器文件保存状态
OperateResult resultCheck = ReceiveStringContentFromSocket( socketResult.Content );
if (!resultCheck.IsSuccess) return resultCheck;
if (resultCheck.Content1 == 1)
{
return OperateResult.CreateSuccessResult( );
}
else
{
return new OperateResult( StringResources.Language.ServerFileCheckFailed );
}
}
#endregion
#region Object Override
///
/// 获取本对象的字符串表示形式
///
/// 字符串信息
public override string ToString()
{
return "FileClientBase";
}
#endregion
}
}