具体代码http://www.meidiedz.cn/memorystream.rar代码不多,只有20行,我对内存流的使用不是很熟悉,第一次下载没问题,第2次下载的时候就出错了,全部身家只有100分了,希望大家能帮忙我一下

解决方案 »

  1.   

    可以帮忙解决的话,请或贴指出或者发修改过的文件到我的EMAIL:[email protected],不胜感激
      

  2.   

    这里有个关于sendstream的使用
    http://blog.csdn.net/formiss/archive/2007/04/30/1592680.aspx
      

  3.   

    是哪篇文章?我看了你一篇是用FileMemorystream传文件的,我之前也用过,没有错误,这次我希望通过memorystream传文件,希望大家能帮帮我
      

  4.   

    谢谢楼上两位热心网友,我把代码贴一下吧,不加if else begin 和 end ,就是20几行代码由于客户端和服务端实现的功能是一样的,所以代码也是一样,不过ServerSocket1ClientRead换成ClientSocket1ClientRead而已procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      str,s:string;
    MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
      len:integer;
    begin  if isdown=false then
      begin
              str:=socket.ReceiveText;
              s:=Copy(str,1,5);
              if s='11111' then
              begin
                 m:=Tmemorystream.Create;
                m.LoadFromFile(copy(str,6,length(str)));
                m.Position:=0;
                len:=m.Size;
                self.ServerSocket1.Socket.Connections[0].SendText(inttostr(len)) ;
              end;          if s='22222' then
              begin
                m.Position:=0;
                self.ServerSocket1.Socket.Connections[0].SendStream(m);
              end;
      end
      else
      begin
        if msize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
        begin
              // m.Position:=0;
          S := Socket.ReceiveText;
          msize := Strtoint(S); {设置需接收的字节数}
          self.ProgressBar1.Max:= msize;
          ServerSocket1.Socket.Connections[0].SendText('22222'); {发指令通知服务端开始发送图象}
        end
        else
        begin
              len := socket.ReceiveLength; {读出包长度}
              ProgressBar1.Position:=ProgressBar1.Position+len;
              Socket.ReceiveBuf(MyBuffer, len); {接收数据包并读入缓冲区内}
              m.Write(MyBuffer, len); {将数据写入流中}
              if m.Size >= msize then {如果流长度大于需接收的字节数,则接收完毕}
              begin
                try
                  m.SaveToFile('d:\2.mp3');
                finally {以下为清除工作 }
                 // fillchar(MyBuffer,   sizeof(MyBuffer),   0);
                  msize:=0;
                  m.Position:=0;
                  m.Clear;
                  ProgressBar1.Position:=ProgressBar1.Max;
                  showmessage('接受完毕');
                end;
              end;
         end;
       end;  
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      m:=Tmemorystream.Create;
      msize:=0;
      isdown:=false;
    end;procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      s:string;
    begin
     s:=socket.ReceiveText;
      if s='down' then
      begin
        isdown:=false;
        self.ServerSocket2.Socket.Connections[0].SendText('downOK') ;
      end;  if s='downOK' then
      begin
      isdown:=true;
      self.ServerSocket1.Socket.Connections[0].SendText('11111'+'d:\1.mp3');
      end;  
    end;
      

  5.   

    是你的服务端代码出的问题,把
     if s='11111' then
              begin
                 m:=Tmemorystream.Create;////////这一句添上.FormClose(...)中,把
    m.Free;删除.调用SendStream似乎会自动把流释放掉,所以你需要重新Create.
      

  6.   

    对服务端来说,做为sendstream参数的流,会为Socket 所“拥有”,Socket对象结束时,它也将结束,而不要自己去释放它,否则,会触发一个异常。