public bool SendFile(FileInfo EzoneFile) { FileStream EzoneStream = EzoneFile.OpenRead(); PacketSize = 8192; //包的数量 PacketCount = (int)(EzoneStream.Length / ((long)PacketSize)); //最后一个包的大小 LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount))); //指向远程服务端节点 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //发送[文件名]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name)); //发送[包的大小]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString())); //发送[包的总数量]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString())); //发送[最后一个包的大小]到客户端 TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString())); bool isCut = false; //数据包 byte[] data = new byte[PacketSize]; Position = 0; //开始循环发送数据包 for (int i = 0; i < PacketCount; i++) { //从文件流读取数据并填充数据包 EzoneStream.Read(data, 0, data.Length); //发送数据包 Position++; stopwatch.Reset(); stopwatch.Start(); if (TransferFiles.SendVarData(client, data) == 3) { isCut = true; return(false); } stopwatch.Stop(); if (stopwatch.ElapsedMilliseconds == 0) { speed = 0; } else { speed = (1000 * data.Length) / (int)(stopwatch.ElapsedMilliseconds * 1000); } } //如果还有多余的数据包,则应该发送完毕! if (LastDataPacket != 0) { data = new byte[LastDataPacket]; EzoneStream.Read(data, 0, data.Length); TransferFiles.SendVarData(client, data); } PacketCount = Position = 0; //关闭文件流 EzoneStream.Close(); return(true); }
public void Create(object clientSocket) { while (true) { Socket client = clientSocket as Socket; //获得客户端节点对象 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名] string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的总数量] bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); string fullPath = Path.Combine(Environment.CurrentDirectory, SendFileName); //创建一个新文件 FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write); //已发送包的个数 SendedCount = 0; Message temp = new Message("sys", SendFileName + "正在接收!", null); FileReceived(temp.ToString()); while (SendedCount < (bagCount + 1)) { stopwatch.Reset(); stopwatch.Start(); byte[] data = TransferFiles.ReceiveVarData(client); stopwatch.Stop(); if (stopwatch.ElapsedMilliseconds == 0) { speed = 0; } else { speed = (1000 * data.Length) / (int)(stopwatch.ElapsedMilliseconds * 1000); } if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); //显示已发送包的个数 } } SendedCount = bagCount = 0; //关闭文件流 MyFileStream.Close(); //关闭套接字 //client.Close(); Message temp1 = new Message("sys", SendFileName + "接收完毕!", null); FileReceivedFinish(temp1.ToString()); } }