我发的收到的文件和我发送的文件大小不同,而且打不开,请高手解决
server:const
FILESIZE=1024;var
fs:tfilestream;procedure TForm1.serverExecute(AThread: TIdPeerThread);
begin
  if edtpath.Text <>'' then
  begin
    try try
      if not assigned(fs) then
      begin
        fs:=tfilestream.Create(edtpath.text,fmopenread);
      end;      athread.connection.WriteStream(fs,false,true,FILESIZE);
      if not displaysizeleft then
        athread.Connection.Disconnect;
    except on ex:exception do
      raise exception.Create(ex.Message );
    end;
    finally
    begin
      if fs.Position =fs.Size then
        fs.Free;
    end;
    end;
  end;
end;
client:procedure TForm1.btnconnectClick(Sender: TObject);
var
  ms:tmemorystream;
begin
  try try
    if not client.Connected then
    begin
      client.Host:='127.0.0.1';
      client.Port:=8080;
      client.Connect();
    end;    ms:=tmemorystream.Create;
    client.readstream (ms,-1,true);
    showmessage(inttostr(ms.size));
    ms.SaveToFile('d:\text.bmp');
  except on ex:exception do
    raise exception.Create(ex.Message );
  end;
  finally
    ms.Free;
  end;
end;

解决方案 »

  1.   

    edtpath.Text 是什么?为什么不用sample里的打开文件的控件呢?那个可以得到具体的路径和文件名。
    接收的时候也要把文件名(扩展名)写得相同才行。
      

  2.   

    我的确edtpath是edit控件,是用opendialog获得文件的路径的
      

  3.   

    我是用TSocketServer和TSocketClient控件实现文件传输的,你可以参考下:
    以下是服务端的代码:
    unit UnitServer;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ScktComp, ExtCtrls, ComCtrls, ActnList, Menus;const
      MP_START = '*****';
      MP_FILENAME = '#####';
      MP_SUCCESS = '&&&&&';
      MP_QUERY = '11111';
      MP_REFUSE = '22222';
      MP_ACCEPT = '33333';
      MP_NEXTWILLBEDATA = '44444';
      MP_DATA = '55555';
      MP_ABORT = '66666';
      MP_OVER = '77777';
      MP_CHAT = '88888';
      MP_END = '99999';
      MP_FILEPROPERTY = '00000';
      MP_FILENOTPROPERTY = '^^^^^';  WM_TRANSFER_END = WM_USER + 303;type
      TForm1 = class(TForm)
        ss: TServerSocket;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        Panel1: TPanel;
        Button1: TButton;
        Memo1: TMemo;
        ListView1: TListView;
        SaveDialog1: TSaveDialog;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        ActionList1: TActionList;
        SaveLog: TAction;
        ClearLog: TAction;
        procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure ssClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure Button1Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure SaveLogExecute(Sender: TObject);
        procedure ClearLogExecute(Sender: TObject);
      private
        fsRecv: TFileStream;
        bStart: Boolean;
        TickCount: Longword;    ClientSocketHandleList: TStringList;    procedure WM_TRANSFER(var Message: TMessage); message WM_TRANSFER_END;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      sFileName: string;
      sUserName: string;
      Running: Boolean;implementation
      

  4.   

    uses UnitDM;{$R *.DFM}procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      sTemp: string;
      bufRecv: Pointer;
      iLength: Integer;  sPath: string;
      sTemp1: string;
      i: Integer;  AItem: TListItem;
    begin
      iLength := Socket.ReceiveLength;
      GetMem(bufRecv, iLength);
      try
        Socket.ReceiveBuf(bufRecv^, iLength);
        sTemp := StrPas(PChar(bufRecv));    sTemp1 := sTemp;    sTemp := Copy(sTemp, 1, 5);    if sTemp = MP_FILENAME then
        begin
          sTemp := Copy(sTemp1, 6, Length(sTemp1) - 5);
          sFileName := Copy(sTemp, 1, 12);      for i := 0 to ListView1.Items.Count - 1 do
          begin
            if Socket.RemoteAddress = ListView1.Items[i].Caption then
            begin
              ListView1.Items[i].SubItems[0] := sFileName;
              ListView1.Items[i].SubItems[1] := '接收就绪';
              Socket.SendText(MP_SUCCESS);
              Break;
            end;
          end;
        end    else if sTemp = MP_QUERY then
        begin
          //i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle));      for i := 0 to ListView1.Items.Count - 1 do
          begin
            if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
            begin
              sFileName := ListView1.Items[i].SubItems[0] + '.rar';
              sUserName := sFileName;
              Break;
            end;
          end;      {
          if i <> -1 then
          begin
            sFileName := ListView1.Items[i].SubItems[0] + '.rar';
            sUserName := sFileName;
          end;
          }
          
          sPath := ExtractFilePath(Application.ExeName);      sPath := sPath + '上传目录';      if not DirectoryExists(sPath) then
            ForceDirectories(sPath);      sFileName := sPath + '\' + sFileName;      fsRecv := TFileStream.Create(sFileName, fmCreate);
          //如果愿意接收数据。
          Memo1.Lines.Add ('开始接收"' + sUserName + '"!');
          TickCount := GetTickCount;
          Socket.SendText(MP_ACCEPT);
          //通知发送端发送数据。
          bStart := False;     end
        else if sTemp = MP_FILEPROPERTY then
        begin
          //要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
          //时间进度显示
          //iRecvLength:=StrToInt(Copy(sTemp,2,Length(sTemp)));
          Socket.SendText(MP_NEXTWILLBEDATA);
          //接收文件长度并要求继续传送数据。
        end
        else if sTemp = MP_FILENOTPROPERTY then
        begin
          Memo1.Lines.Add ('源文件' + sUserName + '不存在,接收失败,请检查客户端文件!');
          Memo1.Lines.Add ('总共时间:'+ IntToStr(GetTickCount - TickCount));      {
          i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle));
          if i <> -1 then
          begin
            ListView1.Items[i].SubItems[1] := '接收失败';
          end;
          }      for i := 0 to ListView1.Items.Count - 1 do
          begin
            if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
            begin
              ListView1.Items[i].SubItems[1] := '接收失败';
              Break;
            end;
          end;       SendMessage(Form1.Handle, WM_TRANSFER_END, 0, 0);
          fsRecv.Free;      DeleteFile(sFileName);
        end
        else if sTemp = MP_NEXTWILLBEDATA then
        begin
          Socket.SendText(MP_DATA);
          //要求发送端发送数据。
          //准备好接收数据。
        end
        else if sTemp = MP_END then//文件传送结束。
        begin
          Memo1.Lines.Add ('接收"' + sUserName + '"结束!');
          Memo1.Lines.Add ('总共时间:' + IntToStr(GetTickCount - TickCount));      {
          i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle));
          if i <> -1 then
          begin
            ListView1.Items[i].SubItems[1] := '接收完毕';
          end;
          }      for i := 0 to ListView1.Items.Count - 1 do
          begin
            if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
            begin
              ListView1.Items[i].SubItems[1] := '接收完毕';
              Break;
            end;
          end;      SendMessage(Form1.Handle, WM_TRANSFER_END, 0, 0);
          fsRecv.Free;
        end
        else
        begin
          if not bStart then
          begin
            Memo1.Lines.Add('接收数据');
            bStart := True;
          end;
          fsRecv.WriteBuffer(bufRecv^, iLength);
          Socket.SendText(MP_NEXTWILLBEDATA);
        end;
      finally
        FreeMem(bufRecv, iLength);
      end;
    end;
      

  5.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Memo1.Clear;  ss.Port := 3000;
      ss.Open;  ClientSocketHandleList := TStringList.Create;
      ClientSocketHandleList.Clear;  Running := False;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ss.Close;  ClientSocketHandleList.Free;
    end;procedure TForm1.ssClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      SocketHandle: string;
      AItem: TListItem;
      i: Integer;
      Flag: Boolean;
    begin
      SocketHandle := IntToStr(Socket.SocketHandle);
      ClientSocketHandleList.Add(SocketHandle);  Flag := False;
      for i := 0 to ListView1.Items.Count - 1 do
      begin
        if Socket.RemoteAddress = ListView1.Items[i].Caption then
        begin
          if ListView1.Items[i].SubItems[0] <> '' then
            ListView1.Items[i].SubItems[1] := '接收就绪'
          else
            ListView1.Items[i].SubItems[1] := '已连接';      ListView1.Items[i].SubItems[2] := SocketHandle;
          Flag := True;
          Break;
        end;
      end;  if Not Flag then
      begin
        AItem := ListView1.Items.Add;
        AItem.Caption := Socket.RemoteAddress;
        AItem.SubItems.Add('');
        AItem.SubItems.Add('已连接');
        AItem.SubItems.Add(SocketHandle);
      end;
    end;procedure TForm1.ssClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      SocketHandle: string;
      Index: Integer;
      i: Integer;
    begin
      SocketHandle := IntToStr(Socket.SocketHandle);
      Index := ClientSocketHandleList.IndexOf(SocketHandle);  ClientSocketHandleList.Delete(Index);
      for i := 0 to ListView1.Items.Count - 1 do
      begin
        if ListView1.Items[i].SubItems[2] = SocketHandle then
        begin
          ListView1.Items[i].SubItems[1] := '已断开';
          Break;
        end;
      end; 
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
      j: Integer;
    begin
      if ListView1.SelCount > 0 then
      begin
        for i := 0 to ListView1.Items.Count - 1 do
        begin
          if ((ListView1.Items[i].SubItems[1] = '接收就绪') and (ListView1.Items[i].Selected)) then
          begin
            j := ClientSocketHandleList.IndexOf(ListView1.Items[i].SubItems[2]);        ss.Socket.Connections[j].SendText(MP_START + ListView1.Items[i].SubItems[0]);
            Running := True;
            repeat
              Application.ProcessMessages;
            until (Running = False);
          end;
        end;
      end
      else
      begin
        for i := 0 to ListView1.Items.Count - 1 do
        begin
          if ListView1.Items[i].SubItems[1] = '接收就绪' then
          begin
            j := ClientSocketHandleList.IndexOf(ListView1.Items[i].SubItems[2]);        ss.Socket.Connections[j].SendText(MP_START + ListView1.Items[i].SubItems[0]);
            Running := True;
            repeat
              Application.ProcessMessages;
            until (Running = False);
          end;
        end;
      end;
    end;procedure TForm1.WM_TRANSFER(var Message: TMessage);
    begin
      Running := False;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      PageControl1.ActivePageIndex := 0;
    end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    var
      i: Integer;
      Flag: Boolean;
    begin
      Flag := False;
      for i := 0  to ListView1.Items.Count - 1 do
      begin
        if ListView1.Items[i].SubItems[1] = '接收就绪' then
        begin
          Flag := True;
          Break;
        end;
      end;
      if Flag then
        if Application.MessageBox('还有已经就绪的客户端还没有上传文件,确认要关闭服务端吗?', '提示', MB_YESNO + MB_ICONINFORMATION) = IDYES then
          CanClose := True
        else
          CanClose := False
      else
        CanClose := True;
    end;procedure TForm1.SaveLogExecute(Sender: TObject);
    begin
      if SaveDialog1.Execute then
        Memo1.Lines.SaveToFile(SaveDialog1.FileName);
    end;procedure TForm1.ClearLogExecute(Sender: TObject);
    begin
      if Application.MessageBox('确定要清除当前的日志吗?', '提示', MB_YESNO + MB_ICONINFORMATION) = IDYES then
        Memo1.Lines.Clear;
    end;end.