mscomm 如何传送、接收文件 请大家给出源码参考

解决方案 »

  1.   

    winsocket的参考一下
    //服务器端接收来自客户端的信息
    procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      msgr,theFileName:string;
      bufRecv:Pointer;
      iLength:Integer;
    begin
      //接收到的数据的长度
      iLength:=Socket.ReceiveLength;
      //开辟一块新的内存,用来保存接收到的数据
      GetMem(bufRecv,iLength);
      try
        //接收数据
        Socket.ReceiveBuf(bufRecv^,iLength);
        //将接收到的数据以字符串的形式存到msgr中
        msgr:=StrPas(PChar(bufRecv));
        //取前5个字符
        msgr:=Copy(msgr,1,5);
        if msgr=MP_QUERY then
        begin
          //去掉字符串前后的空格和控制字符
          msgr:=Trim(StrPas(PChar(bufRecv)));
          //第5个字符后面的字符串为文件名
          theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr)));
          SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:';
          SaveDialog1.FileName:=theFileName;
          //点击确认保存按钮
          if SaveDialog1.Execute then
          begin
            //为需保存的文件创建文件流
            fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
            //如果同意接收数据。
            memo1.Lines.Add ('开始接收!');
            TickCount:=GetTickCount;
            //发送同意接收文件的信息
            Socket.SendText(MP_ACCEPT);
            tStart:=False;
          end
          else
            //发送拒绝接收文件的信息
            Socket.SendText(MP_REFUSE);
        end
        else if msgr=MP_FILEPROPERTY then
        begin
          //接收文件长度并说明主机可以接收数据了
          Socket.SendText(MP_NEXTWILLBEDATA);
        end
        else if msgr=MP_NEXTWILLBEDATA then
        begin
          //要求发送端发送数据
          Socket.SendText(MP_DATA);
        end else if msgr=MP_END then
        begin
          memo1.Lines.Add ('文件传送完成!');
          memo1.Lines.Add ('接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
          fsRecv.Free;
        end
        //接收到文件传送取消信息
        else if msgr=MP_ABORT then    
        begin
          memo1.Lines.Add ('MP_ABORT');
          Socket.SendText(MP_ABORT);
          fsRecv.Free;
        end
       else
        begin
          if not tStart then
          begin
            memo1.Lines.Add('接收数据...');
            tStart:=True;
          end;
          //将接收缓冲区数据写入文件
          fsRecv.WriteBuffer(bufRecv^,iLength);
          //通知客户端继续发送数据
          Socket.SendText(MP_DATA);
        end;
      finally
        //释放内存
        FreeMem(bufRecv,iLength);
      end;
    end;