using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using LYFZ.Network.EnumerateLibrary;
using System.ComponentModel;
using HPSocketCS.Extended;
using System.Runtime.InteropServices;
namespace LYFZ.Network.TCPNetworkClient
{
///
/// TCP网络通信客户端
///
public class TCP_NetworkClient
{
public TCP_NetworkClient() {
}
#region 新版网络客户端程序处理代码
TCP_NetworkClient tFileClient=null;
///
/// 文件传送通道
///
public TCP_NetworkClient TFileClient
{
get {
if (this.tFileClient == null)
{
this.tFileClient = new TCP_NetworkClient();
}
return this.tFileClient;
}
}
static TCP_NetworkClient mainStoreClient = null;
///
/// 总店通道
///
public static TCP_NetworkClient MainStoreClient
{
get
{
if (TCP_NetworkClient.mainStoreClient == null)
{
TCP_NetworkClient.mainStoreClient = new TCP_NetworkClient();
}
return TCP_NetworkClient.mainStoreClient;
}
}
///
/// 连接总店服务器 只有在分店客户端中使用
///
///
public static bool ConnectionMainStoreServer()
{
bool ret = false;
if (LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore)
{
if (TCP_NetworkClient.MainStoreClient.AppState != HPSocketCS.Extended.AppState.Started)
{
ret = TCP_NetworkClient.MainStoreClient.ConnectionServer(LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.MainStoreServerIP,
Convert.ToUInt16(LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.ServerPort));
}
else {
ret = true;
}
}
return ret;
}
static bool isRemoteCloudClient = false;
///
/// 是否为远程云版客户端
///
public static bool IsRemoteCloudClient
{
get { return isRemoteCloudClient; }
set { isRemoteCloudClient = value; }
}
private AppState appState = AppState.Stoped;
///
/// 当前网络状态
///
public AppState AppState
{
get { return appState; }
set { appState = value; }
}
// private delegate void ConnectUpdateUiDelegate();
// private delegate void SetAppStateDelegate(AppState state);
HPSocketCS.TcpPackClient client = new HPSocketCS.TcpPackClient();
///
/// 客户端连接
///
public HPSocketCS.TcpPackClient Client
{
get { return client; }
}
///
/// 连接服务器
///
/// ip
/// 端口
/// 是否异步连接
///
public bool ConnectionServer(string hostOrIP="", ushort port=0, bool isAsyncConn = false)
{
try
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
return true;
}
if (!this.isInitializesNetwork)
{
this.InitializesNetwork();
}
LYFZ.Model.Model_Config mConfig = new LYFZ.BLL.BLL_Config().GetModel_SysConfig();
if (hostOrIP != "")
{
mConfig.ServerHostOrIP = hostOrIP;
}
else {
hostOrIP = mConfig.ServerHostOrIP;
}
if (port != 0)
{
mConfig.ServerPort = port;
}
else {
port =Convert.ToUInt16(mConfig.ServerPort);
}
bool cAsyncConn = isAsyncConn;
// 写在这个位置是上面可能会异常
SetAppState(AppState.Starting);
// AddMsg(string.Format("$Client Starting ... -> ({0}:{1})", ip, port));
LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端开始连接... -> ({0}:{1})", hostOrIP, port));
if (client.Connetion(hostOrIP, port, cAsyncConn))
{
if (cAsyncConn == false)
{
SetAppState(AppState.Started);
}
this.Wapper = new TCP_RemoteDataHandlerPassiveMode(client);
// AddMsg(string.Format("$Client Start OK -> ({0}:{1})", ip, port));
LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端连接OK -> ({0}:{1})", hostOrIP, port));
return true;
}
else
{
SetAppState(AppState.Stoped);
throw new Exception(string.Format("客户端连接出错 -> {0}({1})", client.ErrorMessage, client.ErrorCode));
}
}
catch (Exception ex)
{
LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("客户端连接失败-> ({0})", ex.Message));
}
return false;
}
///
/// 关闭客户端连接
///
///
public bool CloseConnected()
{
// 停止服务
// LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("准备关闭客户端连接"));
// if (this.AppState == HPSocketCS.Extended.AppState.Started)
// {
// if (client.Stop())
// {
client.Stop();
SetAppState(AppState.Stoped);
if (this.tFileClient != null && this.tFileClient.AppState == HPSocketCS.Extended.AppState.Started)
{
this.tFileClient.CloseConnected();
}
return true;
//}
//else
//{
// // AddMsg(string.Format("$Stop Error -> {0}({1})", client.ErrorMessage, client.ErrorCode));
// LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format("关闭客户端连接失败-> {0}({1})", client.ErrorMessage, client.ErrorCode));
//}
// }
//else {
// return true;
// }
// return false;
}
bool isInitializesNetwork = false;
///
/// 网络服务是否已初始化
///
public bool IsInitializesNetwork
{
get { return isInitializesNetwork; }
set { isInitializesNetwork = value; }
}
///
/// 申明委托
///
///
///
public delegate void EventVerifiedHandler(LYFZ.Network.TCPNetworkServer.EventLockVerified e);
///
/// EventClientLockVerified事件
///
public event EventVerifiedHandler EventClientVerified;
///
/// 初始化网络
///
void InitializesNetwork()
{
try
{
// 设置client事件
client.OnPrepareConnect += new HPSocketCS.TcpClientEvent.OnPrepareConnectEventHandler(OnPrepareConnect);
client.OnConnect += new HPSocketCS.TcpClientEvent.OnConnectEventHandler(OnConnect);
client.OnSend += new HPSocketCS.TcpClientEvent.OnSendEventHandler(OnSend);
client.OnReceive += new HPSocketCS.TcpClientEvent.OnReceiveEventHandler(OnReceive);
client.OnClose += new HPSocketCS.TcpClientEvent.OnCloseEventHandler(OnClose);
// 设置包头标识,与对端设置保证一致性
client.PackHeaderFlag = 0x1ff;
// 设置最大封包大小
client.MaxPackSize = 0x2000 * 32;
client.SocketBufferSize = 512 * 1024;//client.MaxPackSize;
LYFZ.BLL.BLL_FileLogs.WriteMainLogs("客户初始化网络成功");
SetAppState(AppState.Stoped);
this.isInitializesNetwork = true;
}
catch (Exception ex)
{
SetAppState(AppState.Error);
// AddMsg(ex.Message);
LYFZ.BLL.BLL_FileLogs.WriteMainLogs("客户初始化网络时出错:" + ex.Message);
}
}
HPSocketCS.HandleResult OnPrepareConnect(HPSocketCS.TcpClient sender, uint socket)
{
return HPSocketCS.HandleResult.Ok;
}
HPSocketCS.HandleResult OnConnect(HPSocketCS.TcpClient sender)
{
// 已连接 到达一次
// 设置附加数据
string ip = "";
ushort port = 0;
if (sender.GetListenAddress(ref ip, ref port))
{
HPSocketCS.Extended.ClientInfo ci = new HPSocketCS.Extended.ClientInfo();
ci.ConnId = sender.ConnectionId;
ci.IpAddress = ip;
ci.Port = port;
sender.SetExtra(ci);
}
// 如果是异步联接,更新界面状态
// this.Invoke(new ConnectUpdateUiDelegate(ConnectUpdateUi));
// AddMsg(string.Format(" > [{0},OnConnect]", sender.ConnectionId));
LYFZ.BLL.BLL_FileLogs.WriteMainLogs("已连接:"+ip+":"+port.ToString());
return HPSocketCS.HandleResult.Ok;
}
HPSocketCS.HandleResult OnSend(HPSocketCS.TcpClient sender, byte[] bytes)
{
// 客户端发数据了
//AddMsg(string.Format(" > [{0},OnSend] ->数据发送成功 ({1} bytes)", sender.ConnectionId, bytes.Length));
return HPSocketCS.HandleResult.Ok;
}
HPSocketCS.HandleResult OnReceive(HPSocketCS.TcpClient sender, byte[] bytes)
{
// 数据到达了
try
{
//收到的数据
byte[] receiveBytes = new byte[0];
TcpHeadInfo header = sender.BytesToStruct(bytes);
try
{
DataType dType = (DataType)header.MsgDataType;
int headSize = Marshal.SizeOf(header);
TcpTailInfo tail = new TcpTailInfo();
if (header.IsTail)
{
//有附加尾数据时
int tailSize = Marshal.SizeOf(tail);
byte[] tailBytes = new byte[tailSize];
Array.ConstrainedCopy(bytes, bytes.Length - tailSize, tailBytes, 0, tailBytes.Length);
tail = sender.BytesToStruct(tailBytes);
receiveBytes = new byte[bytes.Length - headSize - tailSize];
Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
tailBytes = null;
}
else
{
// 因为没有附加尾数据,所以大小可以用length - objSize
receiveBytes = new byte[bytes.Length - headSize];
Array.ConstrainedCopy(bytes, headSize, receiveBytes, 0, receiveBytes.Length);
}
ReceiveCacheBuffer recBuffer = sender.CCommonLibrary.GetReceiveCacheBuffer(header.TransportID);
if (recBuffer != null)
{
lock (recBuffer)
{
recBuffer.Length += receiveBytes.Length;
if (recBuffer.BackgroundWorker != null)
{
//总计数器
long sumCount = header.IntactSize;
if (dType == DataType.File)
{
sumCount = tail.FileSize;
}
//当前计数器
long currentCount = recBuffer.Length;
if (header.TransportEnd && tail.IsSendComplete)
{
currentCount = Convert.ToInt64(sumCount);
}
CommonLibrary.SetBackgroundWorker(sumCount, currentCount,"正在接收数据,请稍等...", recBuffer.BackgroundWorker);
}
}
}
//接收到的客户端发送来的数据
byte[] recbytes = null;
try
{
if (header.TransportStart && header.TransportEnd)
{
recbytes = receiveBytes;
receiveBytes = null;
}
else
{
ReceiveData rData = sender.CCommonLibrary.GetReceiveData(header);
if (rData == null)
{
rData = new ReceiveData();
sender.CCommonLibrary.AddReceiveData(rData);
}
rData.ReceiveRemoteClientInfo = header;
rData.ReceiveDataMstream.Write(receiveBytes, 0, receiveBytes.Length);
if (header.TransportEnd)
{
recbytes = rData.ReceiveDataMstream.ToArray();
sender.CCommonLibrary.RemoveReceiveDataData(rData);
}
}
if (recbytes != null)
{
recbytes = HPSocketCS.Extended.DataSetSerializerDeserialize.DataDecompressRetBytes(recbytes);
if (!header.IsTail && header.TransportEnd)
{
tail.IsSendComplete = true;
}
switch (dType)
{
case DataType.Text:
// string ReceiveInfo = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
// AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)>" + ReceiveInfo, sender.ConnectionId, bytes.Length));
if (recBuffer != null)
{
if (!recBuffer.ReceiveComplete(recbytes,tail.IsSendComplete))
{
return HPSocketCS.HandleResult.Error;
}
}
break;
case DataType.File:
if (!sender.ReceiveDownloadFile(header, tail, recBuffer, recbytes))
{
return HPSocketCS.HandleResult.Error;
}
break;
case DataType.Serialization:
case DataType.SQLHelper:
if (recBuffer != null)
{
if (!recBuffer.ReceiveComplete(recbytes, tail.IsSendComplete))
{
return HPSocketCS.HandleResult.Error;
}
}
// break;
break;
case DataType.List:
break;
case DataType.Array:
break;
case DataType.None:
break;
case DataType.PushMessage:
string ReceivePushMessage = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
TCP_ProtocolHelperXML Pushhelper = new TCP_ProtocolHelperXML(ReceivePushMessage.Trim());
TCP_FileProtocol Pushprotocol = new TCP_FileProtocol();
Pushprotocol = Pushhelper.GetProtocol();
Pushprotocol.ReceiveFileSize = recbytes.Length;
if (Pushprotocol.Content.Contains("VitalControl"))
{
string recValue = this.SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.VitalControl, Pushprotocol.Content.Trim(), millisecondsTimeout: 9000);
if (recValue.Trim().Contains("VitalControlOK"))
{
LYFZ.Network.TCPNetworkClient.TCP_NetworkClient.TServerClient.SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.VitalControlOK, recValue.Trim(), millisecondsTimeout: 9000);
}
}
break;
case DataType.ShowForm:
string ReceiveInfo = Encoding.UTF8.GetString(recbytes, 0, recbytes.Length);
TCP_ProtocolHelperXML helper = new TCP_ProtocolHelperXML(ReceiveInfo.Trim());
TCP_FileProtocol protocol = new TCP_FileProtocol();
protocol = helper.GetProtocol();
protocol.ReceiveFileSize = recbytes.Length;
LYFZ.Network.TCPNetworkServer.EventLockVerified e = new TCPNetworkServer.EventLockVerified();
e.CInfo.IpAddress = header.IPAddress;
e.CInfo.Port =Convert.ToUInt16(header.Port);
e.CInfo.Message = protocol.Content;
if (this.EventClientVerified != null)
{
this.EventClientVerified(e);
}
break;
}
}
}
finally
{
recbytes = null;
}
return HPSocketCS.HandleResult.Ok;
}
catch
{
sender.CCommonLibrary.RemoveServerToClientByteList(header.TransportID);
return HPSocketCS.HandleResult.Ignore;
}
}
catch (Exception ex)
{
LYFZ.BLL.BLL_FileLogs.WriteMainLogs("接收数据时出错:" + ex.Message);
return HPSocketCS.HandleResult.Error;
}
finally
{
System.GC.Collect();
}
/* string ReceiveInfo = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)>" + ReceiveInfo, sender.ConnectionId, bytes.Length));
// AddMsg(string.Format(" > [{0},OnReceive] -> ({1} bytes)", sender.ConnectionId, bytes.Length));
return HandleResult.Ok;*/
}
HPSocketCS.HandleResult OnClose(HPSocketCS.TcpClient sender, HPSocketCS.SocketOperation enOperation, int errorCode)
{
try
{
try
{
sender.CCommonLibrary.ClearAllInvalidResource();
}
catch { }
try
{
sender.CCommonLibrary.ClearAllServerToClientByteList();
}
catch { }
SetAppState(AppState.Stoped);
if (errorCode == 0)
{
// 连接关闭了
// AddMsg(string.Format(" > [{0},OnClose]", sender.ConnectionId));
LYFZ.BLL.BLL_FileLogs.WriteMainLogs("连接关闭了");
}
else if (enOperation == HPSocketCS.SocketOperation.Close)
{
LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format(" 服务器已关闭连接> [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
}
else
{
// 出错了
// AddMsg(string.Format(" > [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
LYFZ.BLL.BLL_FileLogs.WriteMainLogs(string.Format(" 连接出错了> [{0},OnError] -> OP:{1},CODE:{2}", sender.ConnectionId, enOperation, errorCode));
}
// 通知界面,只处理了连接错误,也没进行是不是连接错误的判断,所以有错误就会设置界面
// 生产环境请自己控制
// this.Invoke(new SetAppStateDelegate(SetAppState), AppState.Stoped);
}
catch { }
return HPSocketCS.HandleResult.Ok;
}
///
/// 设置程序状态
///
///
void SetAppState(AppState state)
{
appState = state;
}
TCP_RemoteDataHandlerPassiveMode wapper = null;
///
///
///
public TCP_RemoteDataHandlerPassiveMode Wapper
{
get { return this.wapper; }
set { this.wapper = value; }
}
///
/// 刷新客户端连接
///
///
public bool RefreshClientList()
{
if (SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand.RefreshClientList).ToLower().Trim() == "ok")
{
return true;
}
else
{
return false;
}
}
///
/// 发送信息到客服端并返回服务器的处理结果
///
///
///
public string SendMsgToServer(string msg)
{
return SendCommandToServer(msgOrParameters: msg);
}
static string _FromServerStartTimeStamp = "";
///
/// 来自服务器的启动时间标识
///
public static string FromServerStartTimeStamp
{
get { return TCP_NetworkClient._FromServerStartTimeStamp; }
set { TCP_NetworkClient._FromServerStartTimeStamp = value; }
}
///
/// 发送指令到服务端并返回服务器的处理结果
///
/// 要发送到服务器的指令
/// 发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔
///
public string SendCommandToServer(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello", int millisecondsTimeout = 1000*90)
{
string tempMsg = "";
if (this.appState == AppState.Started)
{
tempMsg = this.Wapper.SendCommandToServerRetMessage(command, msgOrParameters, millisecondsTimeout);
}
return tempMsg;
}
///
/// 发送指令到服务端并返回服务器的处理结果
///
/// 要发送到服务器的指令
/// 发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔
///
public TCP_FileProtocol SendCommandToServerRetProtocol(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
{
TCP_FileProtocol protocol = new TCP_FileProtocol();
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
protocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, command, msgOrParameters);
}
return protocol;
}
///
/// 发送指令到服务端并返回二进制字节数组
///
/// 要发送到服务器的指令
/// 发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔
///
public byte[] DataCommandToServerRetByte(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
TCP_FileProtocol protocol = DataCommandToServerProtocol(command, msgOrParameters);
if (protocol.DataArray != null)
{
return protocol.DataArray;
}
else
{
return null;
}
}
else
{
return null;
}
}
///
/// 发送指令到服务端并返回二进制字节数组
///
/// 要发送到服务器的指令
/// 发送到服务器指令的参数或是说明,注:多个参数用 “|”分隔
///
public TCP_FileProtocol DataCommandToServerProtocol(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.Message, string msgOrParameters = "Hello")
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
return this.Wapper.HP_SendCommandToServer(InformationType.Data, command, msgOrParameters);
}
else
{
return new TCP_FileProtocol();
}
}
///
/// 发送SQL指令到服务端并返回结果对象
///
///
///
///
public HPSocketCS.Extended.SQLHelperReturnData SqlCommandToServerReturnData(HPSocketCS.Extended.SQLHelperRequestData requestData, int millisecondsTimeout = 1000*90)
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
return this.Wapper.HP_SendSqlCommandToServer(requestData, millisecondsTimeout);
}
else
{
return new SQLHelperReturnData("发送SQL指令到服务端时失败,网络连接已断开,请检查网络环境。");
}
}
///
/// 上传头像
///
/// 要上传的头像路径
///
///
public string UploadAvatarToServer(string fileFullName, BackgroundWorker backgroundWorker = null)
{
return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadAvatar, fileFullName, System.IO.Path.GetFileName(fileFullName), backgroundWorker);
}
///
/// 上传文件
///
/// 要上传的文件路径
/// 上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”
///
///
public string UploadFileToServer(string fileFullName, string toServerFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, fileFullName, toServerFileFullName, backgroundWorker,autoMainStoreDownload:autoMainStoreDownload);
}
///
/// 上传图片
///
/// 要上传的图片
/// 上传的图片格式
/// 上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”
/// 上传后是否释放图片资源
///
///
public string UploadFileToServer(System.Drawing.Image img, System.Drawing.Imaging.ImageFormat imgFormat, string toServerFileFullName, BackgroundWorker backgroundWorker = null, bool isDisposeImg = true)
{
MemoryStream memoryMS = new MemoryStream();
img.Save(memoryMS, imgFormat);
if (isDisposeImg)
{
img.Dispose();
}
return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, "", toServerFileFullName, backgroundWorker, memoryMS: memoryMS);
}
///
/// 上传内存流
///
/// 要上传的内存流
/// 上传到服务器上的目录路径 以服务器程序的根目录定为 如“UpdateTemp\\testFile.rar”
/// 上传后是否释放图片资源
///
///
public string UploadFileToServer(MemoryStream memoryMS, string toServerFileFullName, BackgroundWorker backgroundWorker = null)
{
return SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand.UploadFile, "", toServerFileFullName, backgroundWorker, memoryMS: memoryMS);
}
///
/// 获取指定服务器端文件的信息
///
/// 为你向服务器请求的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
///
public ServerFileInfo GetServerFileInfo(string sFileName)
{
ServerFileInfo sFileInfo = new ServerFileInfo();
if (IsRemoteCloudClient)
{
// 获取云服务器上指定文件的信息
HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GetFileInfo);
HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
reqParameters.SetRequestParameter("FilePath", sFileName);
requestData.AttachedData = reqParameters.ToBytes();
HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.client, requestData);
if (returnData.ReturnStatus)
{
string fileJson = returnData.DataByteToModelObject();
HPSocketCS.Extended.NetFileInfo fileInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(fileJson);
sFileInfo = new ServerFileInfo(fileInfo.ToString());
}
else
{
sFileInfo.GetMsg = "获取失败,原因:" + returnData.ReturnMessage;
}
}
else
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
try
{
TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GetFileInfo, sFileName);
sFileInfo = new ServerFileInfo(sendFileProtocol.Content);
}
catch { sFileInfo.GetMsg = "连接已断开,请检查网络环境是否正常..."; }
}
}
return sFileInfo;
}
///
/// 下载头像
///
///
/// 头像下载后保存的位置
/// 头像图片名(带扩展名)
///
public string DownloadAvatar(string saveFileFullName, string fileName, BackgroundWorker backgroundWorker = null)
{
return ReceiveFileCommandToServer(null, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, fileName, fileName, backgroundWorker);
}
///
/// 下载头像
///
///
/// 保存到指定的内存流中
/// 头像图片名(带扩展名)
///
public string DownloadAvatar(MemoryStream memoryMS, string fileName, BackgroundWorker backgroundWorker = null)
{
return ReceiveFileCommandToServer(memoryMS, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, "", fileName, backgroundWorker);
}
///
/// 下载头像
///
/// 返回下载的图片
/// 头像图片名(带扩展名)
///
///
public string DownloadAvatar(ref System.Drawing.Bitmap resultBitmap, string fileName, BackgroundWorker backgroundWorker = null)
{
try
{
MemoryStream ImageMS = new MemoryStream();
string retMsg = ReceiveFileCommandToServer(ImageMS, HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, "", fileName, backgroundWorker);
try
{
resultBitmap = new System.Drawing.Bitmap(ImageMS);
}
catch
{
retMsg = "下载失败,头像生成时失败";
}
ImageMS.Close();
ImageMS.Dispose();
return retMsg;
}
catch (Exception ex)
{
return "下载失败:" + ex.ToString();
}
}
///
/// 下载文件
///
/// 下载后保存的位置
/// 为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
///
///
public string DownloadFile(string saveFileFullName, string serverFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
return ReceiveFileCommandToServer(null, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, saveFileFullName, serverFileFullName, backgroundWorker, autoMainStoreDownload);
}
///
/// 删除服务上的文件 多个文件用 “|”分隔
///
/// 要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
///
///
public string DeleteFile(string serverFileFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
string ret = "删除失败";
if (IsRemoteCloudClient)
{
//删除云服务器上的文件
HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.DeleteFile);
HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
reqParameters.SetRequestParameter("delFiles", serverFileFullName);
requestData.AttachedData = reqParameters.ToBytes();
HPSocketCS.Extended.ReturnData returnData= HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
ret = returnData.ReturnMessage;
}
else
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
try
{
TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.DeleteFile, serverFileFullName + "?" + autoMainStoreDownload.ToString());
ret = sendFileProtocol.Content;
}
catch { ret = "连接已断开,请检查网络环境是否正常..."; }
}
}
return ret;
}
///
/// 删除服务上的目录
///
/// 要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”
///
///
public string DeleteDirectory(string serverDirectoryFullName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
string ret = "删除失败";
if (IsRemoteCloudClient)
{
// 删除云服务器上指定目录下的文件
HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.DeleteFile);
HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
reqParameters.SetRequestParameter("dirPath", serverDirectoryFullName);
reqParameters.SetRequestParameter("isDelAllFiles", false);
requestData.AttachedData = reqParameters.ToBytes();
HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
ret = returnData.ReturnMessage;
}
else
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
try
{
serverDirectoryFullName = serverDirectoryFullName + "|false|" + autoMainStoreDownload.ToString();
TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.DeleteDirectory, serverDirectoryFullName);
ret = sendFileProtocol.Content;
}
catch { ret = "连接已断开,请检查网络环境是否正常..."; }
}
}
return ret;
}
///
/// 获取服务上的指定目录下的子目录集合
///
/// 返回的子目录集合
/// 要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”
/// 搜索条件
/// 是否搜索子目录
///
/// 返回的目录集合
///
public string GetDirectoryList(out List retDirectoryList, string serverDirectoryFullName, string searchPattern = "*.*", bool isSearchSubfolder = false, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
string ret = "获取失败";
retDirectoryList = new List();
if (IsRemoteCloudClient)
{
// 获取云服务器上指定目录下的目录列表
HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GetDirectoryList);
HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
reqParameters.SetRequestParameter("dirPath", serverDirectoryFullName);
reqParameters.SetRequestParameter("isSearchSubfolder", isSearchSubfolder);
reqParameters.SetRequestParameter("searchPattern", searchPattern);
requestData.AttachedData = reqParameters.ToBytes();
HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
ret = returnData.ReturnMessage;
if (returnData.ReturnStatus)
{
string fileString = returnData.DataByteToModelObject();
if (fileString.Trim().Trim('|').Length > 0)
{
retDirectoryList.AddRange(fileString.Trim().Trim('|').Split('|'));
}
}
}
else
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
try
{
serverDirectoryFullName = serverDirectoryFullName + "|" + isSearchSubfolder.ToString() + "|" + searchPattern;
if (!autoMainStoreDownload)
{
serverDirectoryFullName = serverDirectoryFullName + "|" + false.ToString();
}
TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GetDirectoryList, serverDirectoryFullName);
ret = sendFileProtocol.Content;
if (ret.Contains("成功") && sendFileProtocol.ExtraInfo.Trim().Trim('|').Length > 0)
{
retDirectoryList.AddRange(sendFileProtocol.ExtraInfo.Trim().Trim('|').Split('|'));
}
}
catch { ret = "连接已断开,请检查网络环境是否正常..."; }
}
}
return ret;
}
///
/// 获取服务上的指定目录下的文件集合
///
/// 返回的文件集合
/// 要删除文件在服务器上的路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile”
/// 搜索条件
/// 是否搜索子目录
///
/// 是否自动连接总店服务器获取总店服务器上的信息
/// 返回的目录集合
///
public string GetDirectoryFileList(out List retFileList, string serverDirectoryFullName, string searchPattern = "*.*", bool isSearchSubfolder = false, BackgroundWorker backgroundWorker = null, int millisecondsTimeout = 1000*90, bool autoMainStoreDownload = true)
{
string ret = "获取失败";
retFileList = new List();
if (IsRemoteCloudClient)
{
// 获取云服务器上指定目录下的文件列表
HPSocketCS.Extended.RequestData requestData = new HPSocketCS.Extended.RequestData((int)HPSocketCS.Extended.TransferRequestCommand.GeTFileList);
HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
reqParameters.SetRequsetEnterpriseIDParameter(HPSocketCS.TcpServer.EnterpriseID);
reqParameters.SetRequsetErpInstallationVerificationCodeParameter(HPSocketCS.TcpServer.VerificationCode);
reqParameters.SetRequestParameter("dirPath", serverDirectoryFullName);
reqParameters.SetRequestParameter("isSearchSubfolder", isSearchSubfolder);
reqParameters.SetRequestParameter("searchPattern", searchPattern);
requestData.AttachedData = reqParameters.ToBytes();
HPSocketCS.Extended.ReturnData returnData = HPSocketCS.Extended.SerializerDataProcessed.HP_SendSerializerCommandToServer(this.Client, requestData);
ret = returnData.ReturnMessage;
if (returnData.ReturnStatus)
{
string fileString = returnData.DataByteToModelObject();
if (fileString.Trim().Trim('|').Length > 0)
{
retFileList.AddRange(fileString.Trim().Trim('|').Split('|'));
}
}
}
else
{
if (this.AppState == HPSocketCS.Extended.AppState.Started)
{
try
{
serverDirectoryFullName = serverDirectoryFullName + "|" + isSearchSubfolder.ToString() + "|" + searchPattern;
if (!autoMainStoreDownload)
{
serverDirectoryFullName = serverDirectoryFullName + "|" + false.ToString();
}
TCP_FileProtocol sendFileProtocol = this.Wapper.HP_SendCommandToServer(InformationType.Message, HPSocketCS.Extended.TransferRequestCommand.GeTFileList, serverDirectoryFullName, millisecondsTimeout);
ret = sendFileProtocol.Content;
if (ret.Contains("成功") && sendFileProtocol.ExtraInfo.Trim().Trim('|').Length > 0)
{
retFileList.AddRange(sendFileProtocol.ExtraInfo.Trim().Trim('|').Split('|'));
}
}
catch { ret = "连接已断开,请检查网络环境是否正常..."; }
}
}
return ret;
}
///
/// 下载文件
///
/// 保存到指定的内存流中
/// 为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
///
///
public string DownloadFile(MemoryStream memoryMS, string serverFileFullName, BackgroundWorker backgroundWorker = null)
{
return ReceiveFileCommandToServer(memoryMS, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, "", serverFileFullName, backgroundWorker);
}
///
/// 下载图像
///
///
/// 返回下载的图片
/// 要下载的图片路径,以服务器程序的根目录定位 如“UpdateTemp\\test.jpg”
///
public string DownloadBitmap(ref System.Drawing.Bitmap resultBitmap, string fileName, BackgroundWorker backgroundWorker = null, bool autoMainStoreDownload = true)
{
try
{
string retMsg = "";
if (LYFZ.WinAPI.CustomPublicMethod.ExistsImgage(fileName))
{
MemoryStream ImageMS = new MemoryStream();
retMsg = ReceiveFileCommandToServer(ImageMS, HPSocketCS.Extended.TransferRequestCommand.DownloadFile, "", fileName, backgroundWorker, autoMainStoreDownload);
if (retMsg.Contains("成功"))
{
try
{
resultBitmap = new System.Drawing.Bitmap(ImageMS);
}
catch
{
retMsg = "下载失败,图像生成失败";
}
}
else
{
if (retMsg.Trim() == "")
{
retMsg = "下载失败,请重试";
}
}
ImageMS.Close();
ImageMS.Dispose();
}
else
{
retMsg = "您请求下载的文件不是图片,不能下载";
}
return retMsg;
}
catch (Exception ex)
{
return "下载失败:" + ex.ToString();
}
}
///
/// 向服务器上传文件
///
/// 上传命令
/// 上传的文件全路径
/// 上传到服务器上的目录路径 以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
/// 参数
///
/// 如果是分店是否自动上传文件到总店服务器
///
public string SendFileCommandToServer(HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.UploadAvatar, string fileFullName = "", string toServerFileFullName = "", BackgroundWorker backgroundWorker = null, MemoryStream memoryMS = null, bool autoMainStoreDownload = true)
{
string tempMsg = "";
string fileName = toServerFileFullName;
bool ret = false;
TCP_NetworkClient myUploadClient = null;
if (!TCP_NetworkClient.IsRemoteCloudClient && autoMainStoreDownload && LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore && TCP_NetworkClient.ConnectionMainStoreServer())
{
myUploadClient = TCP_NetworkClient.MainStoreClient;
}
else
{
myUploadClient = this.TFileClient;
if (this.TFileClient.AppState != HPSocketCS.Extended.AppState.Started)
{
this.TFileClient.ConnectionServer();
}
}
if (command == HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar)
{
//如果是上传头像时设置头像路径
toServerFileFullName = "Resources\\Avatar\\User\\" + System.IO.Path.GetFileName(toServerFileFullName);
}
if (TCP_NetworkClient.IsRemoteCloudClient)
{
toServerFileFullName = toServerFileFullName + "|" + HPSocketCS.TcpServer.EnterpriseID;
if (!HPSocketCS.TcpServer.CloudServerFilter(toServerFileFullName))
{
return "远程云版客户端暂不支持上传此文件";
}
}
if (myUploadClient.AppState == HPSocketCS.Extended.AppState.Started)
{
ServerFileInfo downloadFileInfo = myUploadClient.GetServerFileInfo(toServerFileFullName);
bool isUpload = true;//是否需要上传文件 用于判断要上传的文件是否在服务器上存在,如果存在就不上传
if (downloadFileInfo.IsExists)
{
if (downloadFileInfo.FileMd5.Trim().Length > 0)
{
if (memoryMS == null && fileFullName.Trim().Length > 0)
{
if (System.IO.File.Exists(fileFullName.Trim()))
{
FileInfo fi = new FileInfo(fileFullName.Trim());
if (fi.Length < HPSocketCS.Sdk.FileMD5VerifySize)
{
string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(fileFullName.Trim());
if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
{
isUpload = false;
}
}
}
}
else if (memoryMS != null)
{
if (downloadFileInfo.FileMd5.Trim().Length > 0)
{
memoryMS.Position = 0;
byte[] bytes = new byte[memoryMS.Length];
memoryMS.Read(bytes, 0, bytes.Length);
string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(bytes);
Array.Clear(bytes, 0, bytes.Length);
bytes = null;
if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
{
isUpload = false;
}
}
}
}
}
if (isUpload)
{
if (fileFullName.Trim().Length > 0 && System.IO.File.Exists(fileFullName.Trim()) && memoryMS == null)
{
ret = myUploadClient.Client.UploadFiles(fileFullName.Trim(), toServerFileFullName, backgroundWorker);
}
else if (memoryMS != null)
{
ret = myUploadClient.Client.UploadMemoryStream(memoryMS, toServerFileFullName, backgroundWorker);
}
else
{
return "要上传的文件不存在:" + fileFullName;
}
}
else
{
ret = true;
}
}
else
{
return "网络连接失败,请检查网络环境";
}
if (ret)
{
tempMsg = "上传成功";
}
else
{
tempMsg = "上传失败";
}
return tempMsg;
}
///
/// 临时缓存文件目录
///
static string TemporaryCachefilesPath = LYFZ.WinAPI.CustomPublicMethod.GetFullDirectoryPath(LYFZ.WinAPI.CustomPublicMethod.BasePath) + "Temp\\TemporaryCachefiles\\";
///
/// 从服务器下载文件
///
///
/// 下载命令
/// 下载后要保存的文件全路
/// 为你向服务器请求要下载的文件路径,以服务器程序的根目录定位 如“UpdateTemp\\testFile.rar”
///
/// 请求下载的次数 用于在下载失败时判断是否自动重新请求下载
/// 如果是分店是否自动到总店服务器下载文件
///
public string ReceiveFileCommandToServer(MemoryStream memoryMS = null, HPSocketCS.Extended.TransferRequestCommand command = HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar, string saveFileFullName = "", string serverFileFullName = "", BackgroundWorker backgroundWorker = null,bool autoMainStoreDownload=true)
{
string tempMsg = "";
// if (!isFileServerIng)
{
try
{
bool ret = false;
TCP_NetworkClient myDownLoadClient = null;
if (!TCP_NetworkClient.IsRemoteCloudClient&&autoMainStoreDownload && LYFZ.Network.TCP_RemoteDataHandlerPassiveMode.SoftwareInfo.IsBranchStore && TCP_NetworkClient.ConnectionMainStoreServer())
{
myDownLoadClient = TCP_NetworkClient.MainStoreClient;
}
else {
myDownLoadClient = this.TFileClient;
if (myDownLoadClient.AppState != HPSocketCS.Extended.AppState.Started)
{
myDownLoadClient.ConnectionServer();
}
}
if (myDownLoadClient.AppState == HPSocketCS.Extended.AppState.Started)
{
if (command == HPSocketCS.Extended.TransferRequestCommand.DownloadAvatar)
{
//如果是下载头像时设置头像在服务器上的路径
serverFileFullName = "Resources\\Avatar\\User\\" + System.IO.Path.GetFileName(serverFileFullName);
}
if (TCP_NetworkClient.IsRemoteCloudClient)
{
serverFileFullName = serverFileFullName + "|" + HPSocketCS.TcpServer.EnterpriseID;
}
ServerFileInfo downloadFileInfo = myDownLoadClient.GetServerFileInfo(serverFileFullName);
if (downloadFileInfo.IsExists)
{
if (memoryMS == null && saveFileFullName.Trim().Length > 0)
{
if (downloadFileInfo.FileSize < HPSocketCS.Sdk.FileMD5VerifySize && downloadFileInfo.FileMd5.Trim().Length > 0 && System.IO.File.Exists(saveFileFullName.Trim()))
{
string saveFileMd5 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(saveFileFullName.Trim());
if (LYFZ.WinAPI.SDKSecurity.VerifyMd5Hash(downloadFileInfo.FileMd5.Trim(), saveFileMd5))
{
ret = true;
}
else
{
ret = myDownLoadClient.Client.DownloadFiles(serverFileFullName, saveFileFullName.Trim(), backgroundWorker);
}
}
else
{
ret = myDownLoadClient.Client.DownloadFiles(serverFileFullName, saveFileFullName.Trim(), backgroundWorker);
}
}
else if (memoryMS != null)
{
string TempCachefilePath = TemporaryCachefilesPath + downloadFileInfo.FileMd5 + "_" + System.IO.Path.GetFileName(serverFileFullName);
byte[] TempCachefileBytes = null;
bool TempCachefileExists = false;
try
{
if (System.IO.File.Exists(TempCachefilePath))
{
TempCachefileBytes= System.IO.File.ReadAllBytes(TempCachefilePath);
TempCachefileExists = true;
}
}
catch { }
if (!TempCachefileExists&& downloadFileInfo.FileSize>0)
{
MemoryStream recMemoryMS = myDownLoadClient.Client.DownloadMemoryStream(serverFileFullName, backgroundWorker);
if (recMemoryMS != null)
{
try
{
if (!System.IO.Directory.Exists(TemporaryCachefilesPath))
{
System.IO.Directory.CreateDirectory(TemporaryCachefilesPath);
}
recMemoryMS.Position = 0;
byte[] bytes = new byte[recMemoryMS.Length];
recMemoryMS.Read(bytes, 0, bytes.Length);
System.IO.File.WriteAllBytes(TempCachefilePath, bytes);
Array.Clear(bytes, 0, bytes.Length);
bytes = null;
}
catch { }
recMemoryMS.WriteTo(memoryMS);
memoryMS.Position = 0;
recMemoryMS.Close();
recMemoryMS.Dispose();
recMemoryMS = null;
ret = true;
}
}
else {
memoryMS.Write(TempCachefileBytes, 0, TempCachefileBytes.Length);
System.Array.Clear(TempCachefileBytes, 0, TempCachefileBytes.Length);
TempCachefileBytes = null;
ret = true;
}
}
else
{
return "下载请求错误";
}
}
else
{
return downloadFileInfo.GetMsg;
}
}
else
{
return "网络连接失败,请检查网络环境";
}
if (ret)
{
tempMsg = "下载成功";
}
else
{
tempMsg = "下载失败";
}
}
catch (Exception ex)
{
tempMsg = "下载出错:" + ex.Message;
}
// finally
// {
// isFileServerIng = false;
// }
}
return tempMsg;
}
static TCP_NetworkClient tServerClient = null;
public static TCP_NetworkClient TServerClient
{
get
{
if (TCP_NetworkClient.tServerClient == null)
{
TCP_NetworkClient.tServerClient = new TCP_NetworkClient();
}
return TCP_NetworkClient.tServerClient;
}
}
#endregion
}
}