小D 写了一个文件传送的小程序,一个人对一个人传送可以实现,但是一个人对另一个人传送完了之后
另外那个人再想对发送过文件的人传送文件的时候就会,出现“该文件在被另外一个进程使用”的报错,请问这是怎么会事哦,还有请问怎么样才能实现象MSN 那样同时可以和几个人传送文件啊,请高人指点

解决方案 »

  1.   

    private void startsend()
    {
    if(fullname!=null)
    {
    FileInfo fo = new FileInfo(fullname);

    FileStream fs = fo.OpenRead();
    int packetsize= 500;//包的尺寸
    int packetcount = (int)(fs.Length/(long)packetsize);//包的数量
    // this.textBox8.Text=packetcount.ToString();

    this.progressBar1.Maximum=packetcount; int LastDataPacket = (int)(fs.Length-((long)(packetsize*packetcount))); //最后一个包的大小 // this.textBox9.Text=LastDataPacket.ToString();






    IPEndPoint ipep=new IPEndPoint(IPAddress.Any,int.Parse(localPort));//创建一个网络端点
    Socket server=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个套接字
    server.Bind(ipep);//绑定套接字到端口
    server.Listen(10);//开始侦听(并堵塞该线程)



    while(true)
    {
    client1=server.Accept();

    if(client1.Connected)
    {
    //获得客户端节点对象
    Thread tc = new Thread(new ThreadStart(listenclient)); tc.Start();
    }
    }


    // IPEndPoint clientep=(IPEndPoint)client.RemoteEndPoint;//获得客户端的IP地址
    //
    //
    // // this.textBox7.Text=clientep.Address.ToString();
    //
    // PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(fo.Name)); //发送[文件名]到客户端
    //
    // PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(packetsize.ToString()));//发送[包的大小]到客户端
    //
    // PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(packetcount.ToString()));//发送[包的总数量]到客户端
    //
    // PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));//发送[最后一个包的大小]到客户端
    //
    // //数据包
    // byte[]data=new byte[packetsize];
    // //开始循环发送数据包
    // try
    // {
    // for(int i=0;i<packetcount;i++)
    // {
    // //从文件流读取数据并填充数据包
    // fs.Read(data,0,data.Length);
    // //发送数据包
    // PTP.EzoneModule.SendVarData(client,data);
    // //显示发送数据包的个数
    // // this.textBox10.Text=((int)(i+1)).ToString();
    // //进度条值的显示
    // this.progressBar1.PerformStep();
    // }
    //
    //
    // if(LastDataPacket!=0)  
    // //如果还有多余的数据包,则应该发送完毕!
    // {
    // data=new byte[LastDataPacket];
    // fs.Read(data,0,data.Length);
    // fs.Close();
    // PTP.EzoneModule.SendVarData(client,data);
    // this.progressBar1.Value=this.progressBar1.Maximum;
    // } //关闭套接字
    client1.Close();
    server.Close();
    //关闭文件流
    fs.Close();
    ipep=null;

    this.button2.Enabled=true;
    this.button5.Enabled=false;
    this.button4.Enabled=false;
    // Thread.CurrentThread.Abort();
    MessageBox.Show("文件传输完毕!");


    // catch(Exception e)
    // {
    // client.Close();
    // server.Close();
    // //关闭文件流
    // fs.Close();
    // this.button5.Enabled=false;
    // this.button4.Enabled=false;
    //
    // MessageBox.Show(e.Message);
    // MessageBox.Show(UserAlias);
    //
    //
    // }

    }
    else
    {
    MessageBox.Show("");
    }

    } private void listenclient()
    {
    FileInfo fo = new FileInfo(fullname);

    FileStream fs = fo.OpenRead();
    int packetsize= 500;//包的尺寸
    int packetcount = (int)(fs.Length/(long)packetsize);//包的数量
    // this.textBox8.Text=packetcount.ToString();

    this.progressBar1.Maximum=packetcount; int LastDataPacket = (int)(fs.Length-((long)(packetsize*packetcount))); //最后一个包的大小 // this.textBox9.Text=LastDataPacket.ToString();
    Socket client =client1; 
    IPEndPoint clientep=(IPEndPoint)client.RemoteEndPoint;//获得客户端的IP地址


    // this.textBox7.Text=clientep.Address.ToString();

    PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(fo.Name)); //发送[文件名]到客户端 PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(packetsize.ToString()));//发送[包的大小]到客户端 PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(packetcount.ToString()));//发送[包的总数量]到客户端

    PTP.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));//发送[最后一个包的大小]到客户端

    //数据包
    byte[]data=new byte[packetsize];
    //开始循环发送数据包

    for(int i=0;i<packetcount;i++)
    {
    //从文件流读取数据并填充数据包
    fs.Read(data,0,data.Length);
    //发送数据包
    PTP.EzoneModule.SendVarData(client,data);
    //显示发送数据包的个数
    // this.textBox10.Text=((int)(i+1)).ToString();
    //进度条值的显示
    this.progressBar1.PerformStep();
    }
    if(LastDataPacket!=0)  
    //如果还有多余的数据包,则应该发送完毕!
    {
    data=new byte[LastDataPacket];
    fs.Read(data,0,data.Length);

    PTP.EzoneModule.SendVarData(client,data);
    this.progressBar1.Value=this.progressBar1.Maximum;
    } }
    #endregion
    #region 开始接收文件
    private void StartReceive()
    {
    try
    {
    //指向远程服务端节点
    IPEndPoint ipep=new IPEndPoint(IPAddress.Parse(senderIP),int.Parse(senderPort));
    //创建套接字
    Socket client=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    //连接到发送端
    client.Connect(ipep);
    //获得[文件名]
    string SendFileName=System.Text.Encoding.Unicode.GetString(PTP.EzoneModule.ReceiveVarData(client));
    // this.textBox2.Text=SendFileName;
    //获得[包的大小]
    string pocketbig=System.Text.Encoding.Unicode.GetString(PTP.EzoneModule.ReceiveVarData(client));
    //获得[包的总数量]
    this.textBox8.Text=System.Text.Encoding.Unicode.GetString(PTP.EzoneModule.ReceiveVarData(client));
    this.progressBar1.Maximum=int.Parse(this.textBox8.Text);
    //获得[最后一个包的大小]
    string pocketbigsize=System.Text.Encoding.Unicode.GetString(PTP.EzoneModule.ReceiveVarData(client));
    //创建一个新文件

    FileStream MyFileStream=new FileStream(SendFileName,FileMode.Create,FileAccess.Write);
    //已发送包的个数
    // NetworkStream ns = new NetworkStream(client);
    int SendedCount=0;
    while(true)
    {
    byte[]data=PTP.EzoneModule.ReceiveVarData(client);
    if(data.Length==0)
    {
    break;
    }
    else
    {
    SendedCount++;
    //将接收到的数据包写入到文件流对象
    MyFileStream.Write(data,0,data.Length);
    // MyFileStream.Close();
    // ns.Write(data,0,data.Length);
    //显示已发送包的个数
    // this.textBox10.Text=SendedCount.ToString();
    //进度条值的显示
    this.progressBar1.PerformStep();
    }
    }
    this.progressBar1.Value=this.progressBar1.Maximum;
    //关闭文件流
    MyFileStream.Close();
    //关闭套接字
    client.Close();

    this.button1.Enabled=true;
    this.button5.Enabled=false;
    this.button4.Enabled=false;
    // Thread.CurrentThread.Abort();
    MessageBox.Show("文件接收完毕!");

    }
    catch(Exception e)
    {

    this.button5.Enabled=false;
    this.button4.Enabled=false;
    MessageBox.Show(e.Message);
    MessageBox.Show(UserAlias);
    }


    }
    #endregion
    这是我发送和接收的代码 ,请高手帮我看看哪里出问题了哦没,为什么总是不行哦