C# Socket实现断点上传文件
2014-01-21 11:47
351 查看
public partial class VAV_File_Client
{
private string path = "";
private string strBaseDir = "";
private string host = "";
private int port1 = 0;
private int port2 = 0;
private int port3 = 0;
private bool IsXuChuan = false;
private bool IsFuGai = false;
private int BackDay = 0;
private int SIZEBUFFER = 0;
public VAV_File_Client()
{
path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
strBaseDir = System.Configuration.ConfigurationManager.AppSettings["strBaseDir"].ToString();
host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
BackDay = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["BackDay"].ToString());
SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
}
/// <summary>
/// 启动
/// </summary>
public void start()
{
try
{
GetAllDirList(strBaseDir, BackDay);
foreach (string pathDir in al)
{
if (pathDir.Contains("\t<目录>"))
{
string ddddS = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);
scoketSend(host, port2, Encoding.UTF8.GetBytes(ddddS)); //传输文件名称
sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//传输文件
continue;
}
//string fileName = pathDir.Substring(pathDir.LastIndexOf("\\") + 1);
string fileName = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);
byte[] bs = Encoding.UTF8.GetBytes(fileName);
scoketSend(host, port2, bs); //传输文件名称
sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//传输文件
DelFile(pathDir);
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("end");
}
//连接服务器发送数据
/// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <param name="bs"></param>
private void scoketSend(string host, int port, byte[] bs)
{
IPAddress ip = IPAddress.Parse(host);
// int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
c.Send(bs, bs.Length, 0);
c.Close();
}
//连接服务器接收数据
/// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <returns></returns>
private string scoketReceive(string host, int port)
{
IPAddress ip = IPAddress.Parse(host);
// int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string startStr = "";
byte[] startBytes = new byte[SIZEBUFFER];
int bytess;
bytess = c.Receive(startBytes, startBytes.Length, 0);
startStr += Encoding.ASCII.GetString(startBytes, 0, bytess);
c.Close();
return startStr;
}
//传输文件名称
/// <summary>
///
/// </summary>
/// <param name="path">127.0.0.1</param>
/// <param name="port">2006</param>
private void sendName(string host, int port, string path)
{
//string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
//int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string fileName = path.Substring(path.LastIndexOf("\\") + 1);
//UTF8处理中文
byte[] bs = Encoding.UTF8.GetBytes(fileName);
c.Send(bs, bs.Length, 0);
c.Close();
}
//所传输的文件是否续传
/// <summary>
/// 所传输的文件是否续传
/// </summary>
/// <param name="str"></param>
/// <param name="host">127.0.0.1</param>
/// <param name="port">port = 2007</param>
/// <param name="xuchuan">是否续传</param>
public void setxc(string str, string host, int port, bool xuchuan)
{
IPAddress ip = IPAddress.Parse(host);
port = 2007;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string Str = str;
byte[] bxc = Encoding.ASCII.GetBytes(Str);
c.Send(bxc, bxc.Length, 0);
c.Close();
}
//传输文件/// <summary>
/// <summary>
///
/// </summary>
/// <param name="host">"127.0.0.1"</param>
/// <param name="port">port = 2005;</param>
/// <param name="fileName">带路径的文件
4000
名</param>
/// <param name="xuchuan">是否需要续传</param>
/// <param name="cover">是否覆盖</param>
private void sendFlie(string host, int port, string fileName, bool xuchuan, bool IsFuGai)
{
try
{
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);//建立于远程主机的链接
//接收服务器返回存在的文件大小
byte[] startBytes = new byte[SIZEBUFFER];
string startStr = Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
//已接受文件长度
int startSet = int.Parse(startStr);
byte[] b = new byte[SIZEBUFFER]; //创建文件缓冲区,这里可以认为文件的最大值
if (fileName.Contains("\t<目录>"))
{
c.Close(); //关闭Socket
return;
}
FileStream file = File.Open(fileName, FileMode.Open, FileAccess.Read); //创建文件流
//文件字节总长度
int fileAllLength = (int)file.Length;
//文件剩余字节长度
int fileLast = startSet < fileAllLength ? fileAllLength - startSet : 0;
int intLength = 0;
#region 续传
if (startSet > 0 && startSet < fileAllLength && xuchuan == true)
{
//传输文件是否续传
setxc("xc", host, port3, xuchuan);
file.Seek(long.Parse(startStr), SeekOrigin.Begin); //移动文件流中的当前指针
intLength = int.Parse(startStr);
while (fileLast > 0)
{
int count = file.Read(b, 0, b.Length);
int readbytes = count >= b.Length ? b.Length : count;
readbytes = c.Send(b, 0, readbytes, SocketFlags.None);
Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
fileLast -= count;
intLength += count;
file.Seek(intLength, SeekOrigin.Begin);
if (fileLast == 0)
{
c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
}
}
}
#endregion
#region
else
{
if (fileLast == 0 && IsFuGai == false)
{
setxc("qx", host, port3, xuchuan);
}
else
{
//传输文件是否续传
setxc("bxc", host, port3, xuchuan);
while (fileLast > 0)
{
int count = file.Read(b, 0, b.Length);
int SdCount = fileLast < b.Length ? count : b.Length;
SdCount = c.Send(b, 0, SdCount, SocketFlags.None);
Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
fileLast -= count;//剩余的字节长度
intLength += count;//定位指针用
file.Seek(intLength, SeekOrigin.Begin);
if (fileLast == 0)
{
c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
}
Console.WriteLine("已传送字节: " + intLength);
}
}
}
#endregion
file.Close(); //关闭文件流
string recvStr = "";
byte[] recvBytes = new byte[SIZEBUFFER];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//MessageBox.Show(recvStr);
Console.WriteLine(recvStr);
c.Close(); //关闭Socket
}
catch (NullReferenceException e)
{
Console.WriteLine("{0}", e);
}
}
public ArrayList al = new ArrayList();//定义存储文件和文件夹名的数组
public int aaa = 0;//定义标志位参数,递归时判断该参数,若不为0则非第一次递归
/// <summary>
/// 获取指定某一天之前的文件,不包括当天
/// </summary>
/// <param name="strBaseDir">指定目录</param>
/// <param name="Day">指定天数</param>
public void GetAllDirList(string strBaseDir, int Day)
{
DirectoryInfo di = new DirectoryInfo(strBaseDir);
DirectoryInfo[] diA = di.GetDirectories();
if (aaa == 0)
{
FileInfo[] fis2 = di.GetFiles(); //有关目录下的文件
for (int i2 = 0; i2 < fis2.Length; i2++)
{
if (fis2[i2].CreationTime < DateTime.Now.AddDays(Day) && fis2[i2].FullName.Substring(fis2[i2].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)//指定时间
{
al.Add(fis2[i2].FullName);
}
}
}
for (int i = 0; i < diA.Length; i++)
{
aaa++;
al.Add(diA[i].FullName + "\t<目录>");
//diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
DirectoryInfo[] diA1 = di1.GetDirectories();
FileInfo[] fis1 = di1.GetFiles(); //有关目录下的文件
for (int ii = 0; ii < fis1.Length; ii++)
{
if (fis1[ii].CreationTime < DateTime.Now.AddDays(Day) && fis1[ii].FullName.Substring(fis1[ii].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)
{
al.Add(fis1[ii].FullName);
}
}
GetAllDirList(diA[i].FullName, Day);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="FileName">文件名</param>
public void DelFile(string FileName)
{
FileInfo fInfo = new FileInfo(FileName);
fInfo.MoveTo(FileName.Replace(FileName.Substring(FileName.LastIndexOf("\\") + 1), "DEL_" + FileName.Substring(FileName.LastIndexOf("\\") + 1)));
}
private void DeleteInDir(string szDirPath)
{
if (szDirPath.Trim() == "" || !Directory.Exists(szDirPath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(szDirPath);
FileInfo[] fileInfos = dirInfo.GetFiles();
if (fileInfos != null && fileInfos.Length > 0)
{
foreach (FileInfo fileInfo in fileInfos)
{
}
}
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
DeleteInDir(childDirInfo.ToString()); //递归
}
}
}
}
public partial class VAV_File_Server
{
private string PathFiles = "";
private string host = "";
private int port1 = 0;
private int port2 = 0;
private int port3 = 0;
private bool IsXuChuan = false;
private bool IsFuGai = false;
private int SIZEBUFFER = 0;
/// <summary>
/// 构造函数
/// </summary>
public VAV_File_Server()
{
//path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
PathFiles = System.Configuration.ConfigurationManager.AppSettings["PathFiles"].ToString();
host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
}
Socket s;
Socket s1;
Socket s2;
FileStream file;
public void start()
{
#region
try
{
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe1 = new IPEndPoint(ip, port1);
IPEndPoint ipe2 = new IPEndPoint(ip, port2);
IPEndPoint ipe3 = new IPEndPoint(ip, port3);
//创建Socket 实例
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s1.Bind(ipe1);
s.Bind(ipe2);
s2.Bind(ipe3);
s.Listen(0);
s1.Listen(0);
s2.Listen(0);
while (true)
{
get();
}
s.Dispose();
s1.Dispose();
s2.Dispose();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
// Console.ReadLine();
#endregion
}
private void get()
{
try
{
while (true)
{
//获取Socket连接
Console.WriteLine("等待接收2006发来的数据");
Socket ss = s.Accept();
Console.WriteLine("收到2006的数据");
Console.WriteLine("等待接收2005发来的数据");
Socket ss1 = s1.Accept();
Console.WriteLine("收到2005的数据");
//接收的文件名称
string recvStr = "";
if (ss.Connected) //确定连接
{
byte[] recvBytes = new byte[SIZEBUFFER];
int bytes;
bytes = ss.Receive(recvBytes, recvBytes.Length, 0);
//UTF8处理中文
recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
ss.Close();
}
string path = "";
path = @PathFiles.EndsWith("\\") ? PathFiles + Regex.Replace(recvStr, @"^\\", "") : PathFiles + "\\" + Regex.Replace(recvStr, @"^\\", ""); //存放接收的文件路径
if (path.Contains("\t<目录>"))//D:\\Down\\第一层\t<目录>
{
path = path.Replace("\t<目录>", "");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
ss1.Send(Encoding.ASCII.GetBytes("0"), Encoding.ASCII.GetBytes("0").Length, 0);
continue;
}
long lStartPos = 0;
if (File.Exists(path))
{
file = File.OpenWrite(path);
lStartPos = file.Length;
}
else
{
file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
//file = new FileStream(path, FileMode.Create); //写入文件流
lStartPos = 0;
}
string startStr = lStartPos.ToString();
byte[] bstar = Encoding.ASCII.GetBytes(startStr);
ss1.Send(bstar, bstar.Length, 0);
if (ss1.Connected) //确定连接
{
Console.WriteLine("2005连接成功");
//接收文件是否续传
Console.WriteLine("2007接受文件是否续传");
Socket ss2 = s2.Accept();
string str = "";
if (ss2.Connected) //确定连接
{
byte[] xcBytes = new byte[SIZEBUFFER];
int bytes;
bytes = ss2.Receive(xcBytes, xcBytes.Length, 0);
str += Encoding.ASCII.GetString(xcBytes, 0, bytes);
ss2.Close();
}
if (str == "xc")
{
file.Seek(lStartPos, SeekOrigin.Current); //移动文件流中的当前指针
}
if (str == "bxc")
{
file.Close();
File.Delete(path);
file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
}
if (str == "qx")
{
file.Close();
ss1.Shutdown(SocketShutdown.Both);
ss1.Close();
}
else
{
byte[] nbytes = new byte[SIZEBUFFER];
int nReadSize = 0;
nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);
ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的数据
int TotleSize = nReadSize;
while (nReadSize > 0)
{
file.Write(nbytes, 0, nReadSize);
nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);
if (Encoding.UTF8.GetString(nbytes, 0, nReadSize) == "end")
{
break;
}
ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的数据
Console.WriteLine("接收 " + nReadSize + " 字节");
TotleSize += nReadSize;
Console.WriteLine("接受总数为" + TotleSize);
}
file.Close();
string sendStr = "Ok!Sucess!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
ss1.Send(bs, bs.Length, 0);
ss1.Shutdown(SocketShutdown.Both);
ss1.Close();
}
}
}
}
catch (SocketException e)
{
Console.WriteLine("{0}", e);
}
}
}
{
private string path = "";
private string strBaseDir = "";
private string host = "";
private int port1 = 0;
private int port2 = 0;
private int port3 = 0;
private bool IsXuChuan = false;
private bool IsFuGai = false;
private int BackDay = 0;
private int SIZEBUFFER = 0;
public VAV_File_Client()
{
path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
strBaseDir = System.Configuration.ConfigurationManager.AppSettings["strBaseDir"].ToString();
host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
BackDay = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["BackDay"].ToString());
SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
}
/// <summary>
/// 启动
/// </summary>
public void start()
{
try
{
GetAllDirList(strBaseDir, BackDay);
foreach (string pathDir in al)
{
if (pathDir.Contains("\t<目录>"))
{
string ddddS = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);
scoketSend(host, port2, Encoding.UTF8.GetBytes(ddddS)); //传输文件名称
sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//传输文件
continue;
}
//string fileName = pathDir.Substring(pathDir.LastIndexOf("\\") + 1);
string fileName = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);
byte[] bs = Encoding.UTF8.GetBytes(fileName);
scoketSend(host, port2, bs); //传输文件名称
sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//传输文件
DelFile(pathDir);
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("end");
}
//连接服务器发送数据
/// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <param name="bs"></param>
private void scoketSend(string host, int port, byte[] bs)
{
IPAddress ip = IPAddress.Parse(host);
// int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
c.Send(bs, bs.Length, 0);
c.Close();
}
//连接服务器接收数据
/// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <returns></returns>
private string scoketReceive(string host, int port)
{
IPAddress ip = IPAddress.Parse(host);
// int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string startStr = "";
byte[] startBytes = new byte[SIZEBUFFER];
int bytess;
bytess = c.Receive(startBytes, startBytes.Length, 0);
startStr += Encoding.ASCII.GetString(startBytes, 0, bytess);
c.Close();
return startStr;
}
//传输文件名称
/// <summary>
///
/// </summary>
/// <param name="path">127.0.0.1</param>
/// <param name="port">2006</param>
private void sendName(string host, int port, string path)
{
//string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
//int port = 2006;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string fileName = path.Substring(path.LastIndexOf("\\") + 1);
//UTF8处理中文
byte[] bs = Encoding.UTF8.GetBytes(fileName);
c.Send(bs, bs.Length, 0);
c.Close();
}
//所传输的文件是否续传
/// <summary>
/// 所传输的文件是否续传
/// </summary>
/// <param name="str"></param>
/// <param name="host">127.0.0.1</param>
/// <param name="port">port = 2007</param>
/// <param name="xuchuan">是否续传</param>
public void setxc(string str, string host, int port, bool xuchuan)
{
IPAddress ip = IPAddress.Parse(host);
port = 2007;
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
string Str = str;
byte[] bxc = Encoding.ASCII.GetBytes(Str);
c.Send(bxc, bxc.Length, 0);
c.Close();
}
//传输文件/// <summary>
/// <summary>
///
/// </summary>
/// <param name="host">"127.0.0.1"</param>
/// <param name="port">port = 2005;</param>
/// <param name="fileName">带路径的文件
4000
名</param>
/// <param name="xuchuan">是否需要续传</param>
/// <param name="cover">是否覆盖</param>
private void sendFlie(string host, int port, string fileName, bool xuchuan, bool IsFuGai)
{
try
{
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);//建立于远程主机的链接
//接收服务器返回存在的文件大小
byte[] startBytes = new byte[SIZEBUFFER];
string startStr = Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
//已接受文件长度
int startSet = int.Parse(startStr);
byte[] b = new byte[SIZEBUFFER]; //创建文件缓冲区,这里可以认为文件的最大值
if (fileName.Contains("\t<目录>"))
{
c.Close(); //关闭Socket
return;
}
FileStream file = File.Open(fileName, FileMode.Open, FileAccess.Read); //创建文件流
//文件字节总长度
int fileAllLength = (int)file.Length;
//文件剩余字节长度
int fileLast = startSet < fileAllLength ? fileAllLength - startSet : 0;
int intLength = 0;
#region 续传
if (startSet > 0 && startSet < fileAllLength && xuchuan == true)
{
//传输文件是否续传
setxc("xc", host, port3, xuchuan);
file.Seek(long.Parse(startStr), SeekOrigin.Begin); //移动文件流中的当前指针
intLength = int.Parse(startStr);
while (fileLast > 0)
{
int count = file.Read(b, 0, b.Length);
int readbytes = count >= b.Length ? b.Length : count;
readbytes = c.Send(b, 0, readbytes, SocketFlags.None);
Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
fileLast -= count;
intLength += count;
file.Seek(intLength, SeekOrigin.Begin);
if (fileLast == 0)
{
c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
}
}
}
#endregion
#region
else
{
if (fileLast == 0 && IsFuGai == false)
{
setxc("qx", host, port3, xuchuan);
}
else
{
//传输文件是否续传
setxc("bxc", host, port3, xuchuan);
while (fileLast > 0)
{
int count = file.Read(b, 0, b.Length);
int SdCount = fileLast < b.Length ? count : b.Length;
SdCount = c.Send(b, 0, SdCount, SocketFlags.None);
Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
fileLast -= count;//剩余的字节长度
intLength += count;//定位指针用
file.Seek(intLength, SeekOrigin.Begin);
if (fileLast == 0)
{
c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
}
Console.WriteLine("已传送字节: " + intLength);
}
}
}
#endregion
file.Close(); //关闭文件流
string recvStr = "";
byte[] recvBytes = new byte[SIZEBUFFER];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//MessageBox.Show(recvStr);
Console.WriteLine(recvStr);
c.Close(); //关闭Socket
}
catch (NullReferenceException e)
{
Console.WriteLine("{0}", e);
}
}
public ArrayList al = new ArrayList();//定义存储文件和文件夹名的数组
public int aaa = 0;//定义标志位参数,递归时判断该参数,若不为0则非第一次递归
/// <summary>
/// 获取指定某一天之前的文件,不包括当天
/// </summary>
/// <param name="strBaseDir">指定目录</param>
/// <param name="Day">指定天数</param>
public void GetAllDirList(string strBaseDir, int Day)
{
DirectoryInfo di = new DirectoryInfo(strBaseDir);
DirectoryInfo[] diA = di.GetDirectories();
if (aaa == 0)
{
FileInfo[] fis2 = di.GetFiles(); //有关目录下的文件
for (int i2 = 0; i2 < fis2.Length; i2++)
{
if (fis2[i2].CreationTime < DateTime.Now.AddDays(Day) && fis2[i2].FullName.Substring(fis2[i2].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)//指定时间
{
al.Add(fis2[i2].FullName);
}
}
}
for (int i = 0; i < diA.Length; i++)
{
aaa++;
al.Add(diA[i].FullName + "\t<目录>");
//diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
DirectoryInfo[] diA1 = di1.GetDirectories();
FileInfo[] fis1 = di1.GetFiles(); //有关目录下的文件
for (int ii = 0; ii < fis1.Length; ii++)
{
if (fis1[ii].CreationTime < DateTime.Now.AddDays(Day) && fis1[ii].FullName.Substring(fis1[ii].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)
{
al.Add(fis1[ii].FullName);
}
}
GetAllDirList(diA[i].FullName, Day);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="FileName">文件名</param>
public void DelFile(string FileName)
{
FileInfo fInfo = new FileInfo(FileName);
fInfo.MoveTo(FileName.Replace(FileName.Substring(FileName.LastIndexOf("\\") + 1), "DEL_" + FileName.Substring(FileName.LastIndexOf("\\") + 1)));
}
private void DeleteInDir(string szDirPath)
{
if (szDirPath.Trim() == "" || !Directory.Exists(szDirPath))
return;
DirectoryInfo dirInfo = new DirectoryInfo(szDirPath);
FileInfo[] fileInfos = dirInfo.GetFiles();
if (fileInfos != null && fileInfos.Length > 0)
{
foreach (FileInfo fileInfo in fileInfos)
{
}
}
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
if (dirInfos != null && dirInfos.Length > 0)
{
foreach (DirectoryInfo childDirInfo in dirInfos)
{
DeleteInDir(childDirInfo.ToString()); //递归
}
}
}
}
public partial class VAV_File_Server
{
private string PathFiles = "";
private string host = "";
private int port1 = 0;
private int port2 = 0;
private int port3 = 0;
private bool IsXuChuan = false;
private bool IsFuGai = false;
private int SIZEBUFFER = 0;
/// <summary>
/// 构造函数
/// </summary>
public VAV_File_Server()
{
//path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
PathFiles = System.Configuration.ConfigurationManager.AppSettings["PathFiles"].ToString();
host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
}
Socket s;
Socket s1;
Socket s2;
FileStream file;
public void start()
{
#region
try
{
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe1 = new IPEndPoint(ip, port1);
IPEndPoint ipe2 = new IPEndPoint(ip, port2);
IPEndPoint ipe3 = new IPEndPoint(ip, port3);
//创建Socket 实例
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s1.Bind(ipe1);
s.Bind(ipe2);
s2.Bind(ipe3);
s.Listen(0);
s1.Listen(0);
s2.Listen(0);
while (true)
{
get();
}
s.Dispose();
s1.Dispose();
s2.Dispose();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
// Console.ReadLine();
#endregion
}
private void get()
{
try
{
while (true)
{
//获取Socket连接
Console.WriteLine("等待接收2006发来的数据");
Socket ss = s.Accept();
Console.WriteLine("收到2006的数据");
Console.WriteLine("等待接收2005发来的数据");
Socket ss1 = s1.Accept();
Console.WriteLine("收到2005的数据");
//接收的文件名称
string recvStr = "";
if (ss.Connected) //确定连接
{
byte[] recvBytes = new byte[SIZEBUFFER];
int bytes;
bytes = ss.Receive(recvBytes, recvBytes.Length, 0);
//UTF8处理中文
recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
ss.Close();
}
string path = "";
path = @PathFiles.EndsWith("\\") ? PathFiles + Regex.Replace(recvStr, @"^\\", "") : PathFiles + "\\" + Regex.Replace(recvStr, @"^\\", ""); //存放接收的文件路径
if (path.Contains("\t<目录>"))//D:\\Down\\第一层\t<目录>
{
path = path.Replace("\t<目录>", "");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
ss1.Send(Encoding.ASCII.GetBytes("0"), Encoding.ASCII.GetBytes("0").Length, 0);
continue;
}
long lStartPos = 0;
if (File.Exists(path))
{
file = File.OpenWrite(path);
lStartPos = file.Length;
}
else
{
file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
//file = new FileStream(path, FileMode.Create); //写入文件流
lStartPos = 0;
}
string startStr = lStartPos.ToString();
byte[] bstar = Encoding.ASCII.GetBytes(startStr);
ss1.Send(bstar, bstar.Length, 0);
if (ss1.Connected) //确定连接
{
Console.WriteLine("2005连接成功");
//接收文件是否续传
Console.WriteLine("2007接受文件是否续传");
Socket ss2 = s2.Accept();
string str = "";
if (ss2.Connected) //确定连接
{
byte[] xcBytes = new byte[SIZEBUFFER];
int bytes;
bytes = ss2.Receive(xcBytes, xcBytes.Length, 0);
str += Encoding.ASCII.GetString(xcBytes, 0, bytes);
ss2.Close();
}
if (str == "xc")
{
file.Seek(lStartPos, SeekOrigin.Current); //移动文件流中的当前指针
}
if (str == "bxc")
{
file.Close();
File.Delete(path);
file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
}
if (str == "qx")
{
file.Close();
ss1.Shutdown(SocketShutdown.Both);
ss1.Close();
}
else
{
byte[] nbytes = new byte[SIZEBUFFER];
int nReadSize = 0;
nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);
ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的数据
int TotleSize = nReadSize;
while (nReadSize > 0)
{
file.Write(nbytes, 0, nReadSize);
nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);
if (Encoding.UTF8.GetString(nbytes, 0, nReadSize) == "end")
{
break;
}
ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的数据
Console.WriteLine("接收 " + nReadSize + " 字节");
TotleSize += nReadSize;
Console.WriteLine("接受总数为" + TotleSize);
}
file.Close();
string sendStr = "Ok!Sucess!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
ss1.Send(bs, bs.Length, 0);
ss1.Shutdown(SocketShutdown.Both);
ss1.Close();
}
}
}
}
catch (SocketException e)
{
Console.WriteLine("{0}", e);
}
}
}
相关文章推荐
- 用C#如何实现大文件的断点上传
- Android 使用socket通信来实现文件断点续传上传
- 用C#如何实现大文件的断点上传!
- C# HttpWebRequest可断点上传,下载文件;SOCKET多线程多管道可断点传送大文件
- C#实现上传文件分割,断点续传上传文件
- [转]用C#如何实现大文件的断点上传
- C#实现上传文件分割,断点续传上传文件
- 用C#如何实现大文件的断点上传
- ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- C# 中WinForm 应用程序实现远程文件管理(上传、下载)的种种问题——远程服务器返回错误
- C#文件上传与下载的实现方法
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器
- Android应用开发之使用Socket进行大文件断点上传续传
- C#实现Web文件上传
- c#实现文件上传 下载 从URL上下载
- c# web fileUpload实现多文件上传
- C#简单实现文件上传功能
- Android实现TCP断点上传 后台C#服务接收
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器