题目比较长,我尽量简短,希望你们耐心的看下去,帮助一下小弟吧,愁死我了我做的就是一个文件传送的东西,希望可以传送任意大小的任意文件。问题:我发送端的各种信息读完了,但是我要发送到接收端时,接收端接收时候无法确定要接受的文件的大小,名字等信息怎么办?代码如下:发送端NetworkStream netstream = _tcpc.GetStream();
FileStream fs = new FileStream(要发送的文件地址, FileMode.Open, FileAccess.Read);
BinaryReader fileReader = new BinaryReader(fs, Encoding.Default);
long total = fs.Length;//要发送的文件大小
string fileName = 获取的文件名
MD5 md5 = MD5.Create();
byte[] md5bt = md5.ComputeHash(fs);
string md5code = BitConverter.ToString(md5bt).Replace("-", "");//文件的md5码
//我这里确定了文件名称、文件大小、文件的MD5校验码、
文件内容也随时可以读,请问我下面的bt数组怎么确定
byte[] bt = new byte[];
netstream.Write(bt, 0, bt.Length);
fileReader.Close();
fs.Close();
接收端 byte[] recBuff = new byte[428480]; //接受文件的大小怎么确定
clientSocket.Receive(recBuff);
string str = 存放路径和名称
try
{
//创建文件流对象实例
FileStream fs = new FileStream(str, FileMode.OpenOrCreate, FileAccess.ReadWrite);
//写入文件
fs.Write(recBuff, 0, recBuff.Length);
fs.Close();
}
catch (Exception fe)
{
MessageBox.Show("文件创建/写入错误:" + fe.Message, "提示信息",
MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
}
主要问题就是:我发送的文件大小,接收端怎么能动态的接受,因为如果接收端缓冲区设大了浪费,设小了丢数据先谢谢大家给我解答,另外如果谁有这样的文件发送程序希望能发给我看看,借鉴一下,如果带断点续传更好啦
QQ:86542196
FileStream fs = new FileStream(要发送的文件地址, FileMode.Open, FileAccess.Read);
BinaryReader fileReader = new BinaryReader(fs, Encoding.Default);
long total = fs.Length;//要发送的文件大小
string fileName = 获取的文件名
MD5 md5 = MD5.Create();
byte[] md5bt = md5.ComputeHash(fs);
string md5code = BitConverter.ToString(md5bt).Replace("-", "");//文件的md5码
//我这里确定了文件名称、文件大小、文件的MD5校验码、
文件内容也随时可以读,请问我下面的bt数组怎么确定
byte[] bt = new byte[];
netstream.Write(bt, 0, bt.Length);
fileReader.Close();
fs.Close();
接收端 byte[] recBuff = new byte[428480]; //接受文件的大小怎么确定
clientSocket.Receive(recBuff);
string str = 存放路径和名称
try
{
//创建文件流对象实例
FileStream fs = new FileStream(str, FileMode.OpenOrCreate, FileAccess.ReadWrite);
//写入文件
fs.Write(recBuff, 0, recBuff.Length);
fs.Close();
}
catch (Exception fe)
{
MessageBox.Show("文件创建/写入错误:" + fe.Message, "提示信息",
MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
}
主要问题就是:我发送的文件大小,接收端怎么能动态的接受,因为如果接收端缓冲区设大了浪费,设小了丢数据先谢谢大家给我解答,另外如果谁有这样的文件发送程序希望能发给我看看,借鉴一下,如果带断点续传更好啦
QQ:86542196
2. 向服务器查询此任务的未传送的数据块的编号。
3. 如果全都传送了,就结束。否则:
4. 然后使用UDP方式分成10个线程分别并行地向服务器传递那些未传递成功过的数据块。(由于是UDP,服务器没有返回,并且也不保证服务器能够收到数据)
5.当10个线程都结束,返回2。 实际上,就算我们在传送时关闭了客户端机器,它也应该再重启后可以断点续传。
监听
tcpListener.Start();
while (true) // 一直循环,直到线程被中止
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
tcpClient.NoDelay = true;
tcpClient.ReceiveTimeout = 30000;
BinaryReader reader = new BinaryReader(tcpClient.GetStream());
string filename = reader.ReadString();
long total = reader.ReadInt64();
}
使用断点续传 比较好
昨天没有时间,所以没有回复。让我们站在客户端的角度,假设现在开机,我们从本地的数据库(或者说参数文件)中读取到一个上传任务还没有完成,我们就用这个任务的ID号去联系服务器让它告诉我们还有那些文件块需要传送。也许它每一次最多给我们返回10个块,于是客户端就把这10个块并行(TCP线程发送或者UDP发送)到服务器。这就是一个最小工作单元。其实制定了行为规范(逻辑概要设计),至于程序如何编写那就有了标准。我倒是不太愿意直接回复这类纯技术问题,因为服务器不论是保存还是不保存已经发送的数据块,它返回给客户端的数据正确就可以。例如没有保存已经收到的数据库,之后服务器重启了,那么它也是可以返回客户端正确的信息的,可以指导客户端重新发送。只不过这浪费了c/s双反一点点电力和时间而已。逻辑上并没有什么错误。