最近需要做一个局域网内批量传送文件功能 由于首次接触SOCKET 参考网上范例 做了一个简单的传送文件功能 但现在传送文件以后发现 会少文件 比如 一次传送 20个文件 发现只有10几个 如何能保证文件传输正确呢 以下是我的程序 发送端
private void StartSend()
{
//在指定目录及子目录下查找文件
try
{
List<DicFile> listFile = GetFiles();
if (listFile.Count == 0)
{
return;
}
for (int i = 0; i < listFile.Count; i++)
{
FileInfo EzoneFile = new FileInfo(textBox1.Text.Trim()+"/"+listFile[i].strFileName);
string strDate = EzoneFile.Name.Substring(0, 14);
string strName = EzoneFile.Name.Substring(14, listFile[i].strFileName.Length - 18);
if (!checkXml(strName, strDate))
{
continue;
}
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = 50000;
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
//指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep);
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
byte[] data = new byte[PacketSize];
//开始循环发送数据包
for (int j = 0; j < PacketCount; j++)
{
//从文件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length);
//发送数据包
TransferFiles.SendVarData(client, data);
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.SendVarData(client, data);
} //关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
WriteInfo(strName, strDate);
//EzoneFile.MoveTo(textBox1.Text.Trim()+"\\"+EzoneFile.Name.Substring(0,EzoneFile.Name.IndexOf('.'))+"Y.xml");
}
strMessage = "文件传输成功";
this.BeginInvoke(new UIConSet(SetEnd));
}
catch (Exception e)
{
strMessage = e.Message;
this.BeginInvoke(new UIConSet(SetEnd));
}
}接收端
private void Form1_Load(object sender, EventArgs e)
{
//StartReceive();
//开启接收线程
TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
} #region 功能函数 private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); //MessageBox.Show(IPAddress.Any); //创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); while (true)
{ try
{
ClientSocket = server.Accept();
//ClientSocket = client;
TempThread1 = new Thread(new ThreadStart(this.Create));
TempThread1.Start();
}
catch (Exception ex)
{
int k = 0;
}
} }
#endregion public void Create()
{
if (!string.IsNullOrEmpty(txtPath.Text.Trim()))
{
//Socket client = ClientSocket;
//确认连接
//Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)ClientSocket.RemoteEndPoint;
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(ClientSocket));
//创建一个新文件
if (!string.IsNullOrEmpty(SendFileName))
{
try
{
FileStream MyFileStream = new FileStream(txtPath.Text.Trim() + "/" + SendFileName, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{ byte[] data = TransferFiles.ReceiveVarData(ClientSocket);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
}
}
//关闭文件流
MyFileStream.Close();
//关闭套接字
//ClientSocket.Close();
}
catch (Exception)
{
}
}
}
}
private void StartSend()
{
//在指定目录及子目录下查找文件
try
{
List<DicFile> listFile = GetFiles();
if (listFile.Count == 0)
{
return;
}
for (int i = 0; i < listFile.Count; i++)
{
FileInfo EzoneFile = new FileInfo(textBox1.Text.Trim()+"/"+listFile[i].strFileName);
string strDate = EzoneFile.Name.Substring(0, 14);
string strName = EzoneFile.Name.Substring(14, listFile[i].strFileName.Length - 18);
if (!checkXml(strName, strDate))
{
continue;
}
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = 50000;
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
//指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep);
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
byte[] data = new byte[PacketSize];
//开始循环发送数据包
for (int j = 0; j < PacketCount; j++)
{
//从文件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length);
//发送数据包
TransferFiles.SendVarData(client, data);
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.SendVarData(client, data);
} //关闭套接字
client.Close();
//关闭文件流
EzoneStream.Close();
WriteInfo(strName, strDate);
//EzoneFile.MoveTo(textBox1.Text.Trim()+"\\"+EzoneFile.Name.Substring(0,EzoneFile.Name.IndexOf('.'))+"Y.xml");
}
strMessage = "文件传输成功";
this.BeginInvoke(new UIConSet(SetEnd));
}
catch (Exception e)
{
strMessage = e.Message;
this.BeginInvoke(new UIConSet(SetEnd));
}
}接收端
private void Form1_Load(object sender, EventArgs e)
{
//StartReceive();
//开启接收线程
TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
} #region 功能函数 private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); //MessageBox.Show(IPAddress.Any); //创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); while (true)
{ try
{
ClientSocket = server.Accept();
//ClientSocket = client;
TempThread1 = new Thread(new ThreadStart(this.Create));
TempThread1.Start();
}
catch (Exception ex)
{
int k = 0;
}
} }
#endregion public void Create()
{
if (!string.IsNullOrEmpty(txtPath.Text.Trim()))
{
//Socket client = ClientSocket;
//确认连接
//Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)ClientSocket.RemoteEndPoint;
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(ClientSocket));
//创建一个新文件
if (!string.IsNullOrEmpty(SendFileName))
{
try
{
FileStream MyFileStream = new FileStream(txtPath.Text.Trim() + "/" + SendFileName, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{ byte[] data = TransferFiles.ReceiveVarData(ClientSocket);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
}
}
//关闭文件流
MyFileStream.Close();
//关闭套接字
//ClientSocket.Close();
}
catch (Exception)
{
}
}
}
}
http://topic.csdn.net/u/20081024/17/73ef56b0-d021-45b1-b9f2-e1870e69ddd5.html