123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Net.Configuration;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- namespace DllFileSoc
- {
- public class DllSocket
- {
- //public bool UploadFiles(string ip,string port, string clientfilename, string clientpath,ref string msg)
- //{
- // Thread threadClient = null; // 创建用于接收服务端消息的 线程;
- // IPEndPoint endPoint = null;
- // Socket sockClient = null;
- // try
- // {
- // sockClient = RefSocket(ip, port,ref endPoint, ref msg);
- // if (sockClient==null)
- // {
- // LogBLL.Err(msg);
- // return false;
- // }
- // else//与服务器建立通信
- // {
- // try
- // {
- // sockClient.Connect(endPoint);
- // }
- // catch (SocketException se)
- // {
- // LogBLL.Err(sockClient.LocalEndPoint.ToString(), se);
- // return false;
- // }
- // LogBLL.Err("与服务器连接成功!" + sockClient.LocalEndPoint.ToString());
- // //threadClient = new Thread(RecMsg);
- // //threadClient.IsBackground = true;
- // //threadClient.Start();
- // return true;
- // }
- // }
- // catch (Exception ex)
- // {
- // LogBLL.Err(msg, ex);
- // return false;
- // }
- //}
- /// <summary>
- /// 上传文件保存到服务器
- /// </summary>
- /// <param name="IP">服务监听IP地址</param>
- /// <param name="Port">服务监听端口</param>
- /// <param name="path">上传文件的文件夹目录</param>
- /// <param name="filename">需要上传的文件名</param>
- /// <param name="msg">消息</param>
- /// <returns></returns>
- public static bool SendFile(string IP, int Port,string path, string filename ,string macid,string userid, ref string msg)
- {
- //string serverfile = "D:\\SocketServerFile\\WeChatSetup.exe";
- //创建一个文件对象
- FileInfo EzoneFile = new FileInfo(path+filename);
- //打开文件流
- FileStream EzoneStream = EzoneFile.OpenRead();
- long size = EzoneStream.Length;
- byte[] array = new byte[size];//文件
- EzoneStream.Read(array, 0, array.Length);
- string md5 = GetMD5HashFromFile(array);
- //包的大小
- int PacketSize = 1024*1024*2;
- //包的数量
- int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
- //最后一个包的大小
- int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
- //指向远程服务端节点
- IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(IP), Port);
- //创建套接字
- Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //连接到发送端
- try
- {
- client.Connect(ipep);
- }
- catch
- {
- msg ="服务器连接失败!:"+ IP+":"+Port;
- return false;
- }
- //获得客户端节点对象
- IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
- //发送[文件名]
- //TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(EzoneFile.Name));
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes("<--上传-->"));
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(filename));
- //发送macid\userid\md5
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(macid));
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(userid));
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(md5));
- //发送[包的大小]
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(PacketSize.ToString()));
- //发送[包的总数量]
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(PacketCount.ToString()));
- //发送[最后一个包的大小]
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(LastDataPacket.ToString()));
- bool isCut = false;
- //数据包
- byte[] data = new byte[PacketSize];
- //开始循环发送数据包
- for (int i = 0; i < PacketCount; i++)
- {
- //从文件流读取数据并填充数据包
- EzoneStream.Read(data, 0, data.Length);
- //发送数据包
- if (TransferFiles.SendVarData(client, data) == 3)
- {
- isCut = true;
- return false;
- //break;
- }
- }
- //如果还有多余的数据包,则应该发送完毕!
- if (LastDataPacket != 0)
- {
- data = new byte[LastDataPacket];
- EzoneStream.Read(data, 0, data.Length);
- TransferFiles.SendVarData(client, data);
- }
- //关闭文件流
- EzoneStream.Close();
- //关闭套接字
- client.Close();
-
- if (!isCut)
- {
- msg = "文件[" + filename + "]上传成功!";
- return true;
- }
- return false;
- }
- /// <summary>
- /// 从文件服务下载文件
- /// </summary>
- /// <param name="IP">服务监听IP地址</param>
- /// <param name="Port">服务监听端口</param>
- /// <param name="path">下载文件保存到本地的目录</param>
- /// <param name="filename">服务器被下载的文件的完整路径</param>
- /// <param name="msg">消息</param>
- /// <returns></returns>
- public static bool DownFile(string IP, int Port, string path, string filename, ref string msg)
- {
- //指向远程服务端节点
- IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(IP), Port);
- //创建套接字
- Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //连接到发送端
- try
- {
- client.Connect(ipep);
- }
- catch
- {
- msg = "服务器连接失败!:" + IP + ":" + Port;
- return false;
- }
- //获得客户端节点对象
- IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
- //发送[下载指令]
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes("<--下载-->"));
- TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(filename));
- //获得[文件名]
- string SendFileName = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
- //获得[包的大小]
- string bagSize = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
- //获得[包的总数量]
- int bagCount = int.Parse(System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client)));
- //获得[最后一个包的大小]
- string bagLast = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
- string fullPath = Path.Combine(Environment.CurrentDirectory, path + SendFileName);
- try
- {
- //创建一个新文件
- FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
- //已发送包的个数
- int SendedCount = 0;
- while (true)
- {
- byte[] data = TransferFiles.ReceiveVarData(client);
- if (data.Length == 0)
- {
- break;
- }
- else
- {
- SendedCount++;
- //将接收到的数据包写入到文件流对象
- MyFileStream.Write(data, 0, data.Length);
- }
- }
- //关闭文件流
- MyFileStream.Close();
- //关闭套接字
- client.Close();
- msg = "文件[" + filename + "]下载成功!";
- return true;
- }
- catch (Exception ex)
- {
- msg = "文件[" + filename + "]下载失败!"+ex.Message;
- return false;
- }
-
- }
- //Socket RefSocket(string ip,string port,ref IPEndPoint endPoint, ref string msg)
- //{
- // try
- // {
- // IPAddress endip = IPAddress.Parse(ip);
- // endPoint = new IPEndPoint(endip, int.Parse(port));
- // return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- // }
- // catch (Exception ex)
- // {
- // msg = ex.Message;
- // return null;
- // }
- //}
- public static string GetMD5HashFromFile(byte[] filedatas)
- {
- try
- {
- System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
- byte[] retVal = md5.ComputeHash(filedatas);
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < retVal.Length; i++)
- {
- sb.Append(retVal[i].ToString("x2"));
- }
- return sb.ToString();
- }
- catch (Exception ex)
- {
- //errorinfo = ex.Message.ToString();
- return "";
- }
- }
- }
- }
|