题目比较长,我尽量简短,希望你们耐心的看下去,帮助一下小弟吧,愁死我了我做的就是一个文件传送的东西,希望可以传送任意大小的任意文件。问题:我发送端的各种信息读完了,但是我要发送到接收端时,接收端接收时候无法确定要接受的文件的大小,名字等信息怎么办?代码如下:发送端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

解决方案 »

  1.   

    LZ可以把数组长度设的小一点啊,比如4K,然后循环读取、发送文件,这样即使到最后浪费的话也只有不到4K的空间。
      

  2.   

    假设我们要把一个文件传到服务器,客户端可以这样与通讯通讯(实际上画出序列图更好):1. 首先使用TCP方式告诉服务器我要传什么样的文件,文件大小是多少,我们打算分割为多少数据块,每一个数据块的起始位置和大小。服务器端返回一个此人任务的ID号。
    2. 向服务器查询此任务的未传送的数据块的编号。
    3. 如果全都传送了,就结束。否则:
    4. 然后使用UDP方式分成10个线程分别并行地向服务器传递那些未传递成功过的数据块。(由于是UDP,服务器没有返回,并且也不保证服务器能够收到数据)
    5.当10个线程都结束,返回2。 实际上,就算我们在传送时关闭了客户端机器,它也应该再重启后可以断点续传。
      

  3.   

    哦,“当10个线程都结束”有点错误,UDP是不等传送结束的,也不需要启动10个线程。实际上这样延时一段时间,然后返回2,看起来就可以了
      

  4.   

    TcpListener tcpListener = new TcpListener(IPAddress.Any, port);
    监听
    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();
    }
    使用断点续传 比较好
      

  5.   

    可能用MSMQ方式做。简单,实用。
      

  6.   


    昨天没有时间,所以没有回复。让我们站在客户端的角度,假设现在开机,我们从本地的数据库(或者说参数文件)中读取到一个上传任务还没有完成,我们就用这个任务的ID号去联系服务器让它告诉我们还有那些文件块需要传送。也许它每一次最多给我们返回10个块,于是客户端就把这10个块并行(TCP线程发送或者UDP发送)到服务器。这就是一个最小工作单元。其实制定了行为规范(逻辑概要设计),至于程序如何编写那就有了标准。我倒是不太愿意直接回复这类纯技术问题,因为服务器不论是保存还是不保存已经发送的数据块,它返回给客户端的数据正确就可以。例如没有保存已经收到的数据库,之后服务器重启了,那么它也是可以返回客户端正确的信息的,可以指导客户端重新发送。只不过这浪费了c/s双反一点点电力和时间而已。逻辑上并没有什么错误。
      

  7.   

    C/S模式 怎么做才能一传多呢? 一个客户端发送文 ,N个客户端接收