您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> 关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分

关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分

来源:网络整理     时间:2016/9/1 10:23:08     关键词:

关于网友提出的“ 关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分”问题疑问,本网通过在网上对“ 关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分
描述:

现在想使用 TServerSocket stThreadBlocking模式做一个服务器,然后用 TClientSocket做一个客户端,
要求客户端发送一个数据包,内容为:AskFile 服务器接收到后组织数据包,内容为:SendFile, 后面加文件信息及文件,传送给客户端,请高手指教,初次写网络文面的,还望高手帮忙.


解决方案1:

你可以考虑使用indy控件来写,应该简单不少

解决方案2:

procedure TLXServer.IdTCPServerExecute(AContext: TIdContext);
var
  SPort,sIP: string;
  s: string;
  FileName, SaveFileName: string;
  FileStream: TFileStream;
begin
  if AContext.Connection.Connected then 
    begin
      sIP := AContext.Binding.PeerIP;
      SPort := IntToStr(AContext.Binding.PeerPort);
      s := AContext.Connection.IOHandler.ReadLn;
      if SameText(s,'test connect') then
        begin
          //测试连接
          AContext.Connection.IOHandler.WriteLn('ok');
          AddLog(FormatDateTime('yyyy-MM-dd HH:mm:ss',Now) + ' Connect Test '
            + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.PeerPort));
        end;
      if SameText(S, 'file') then
        begin
          AContext.Connection.IOHandler.WriteLn('-filename');
          S := AContext.Connection.IOHandler.ReadLn;
          s := ReplaceStr(s,'%Cur%',ExtractFilePath(ParamStr(0))); //替换程序当前路径
//          AddLog('test:'+s);
          if FileExists(s) then
            begin
              //文件存在,发送文件名
//              AddLog('True');
              FileName := s;
              SaveFileName := ExtractFileName(s);
              AContext.Connection.IOHandler.WriteLn('filename:' + SaveFileName);
              S := AContext.Connection.IOHandler.ReadLn;
              if s = '-size' then
                begin
//                  if ExtractFileName(FileName) = 'Run.log' then
//                    begin
//                      EnterCriticalSection(FUI);
//                      FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
//                      LeaveCriticalSection(FUI);
//                    end
//                  else
                    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
                  AContext.Connection.IOHandler.WriteLn(IntToStr(FileStream.Size));
                  S := AContext.Connection.IOHandler.ReadLn;
                  if s='-ready' then
                    begin
                      AContext.Connection.IOHandler.LargeStream := True;
                      AContext.Connection.IOHandler.Write(FileStream, FileStream.Size);
                      S := AContext.Connection.IOHandler.ReadLn;
                      if s='-ok' then
                        AddLog(FormatDateTime('yyyy-MM-dd HH:mm:ss',Now) + ' Send File: ' + FileName + ' Ok! '
                          + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.PeerPort))
                      else
                        AddLog(FormatDateTime('yyyy-MM-dd HH:mm:ss',Now) + ' Send File: ' + FileName + ' Error! '
                          + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.PeerPort));
                    end;
                  FileStream.Free;
                end;
            end
            else
            begin
              //文件不存在
//              AddLog('false');
              AContext.Connection.IOHandler.Writeln('file not found');
              AddLog(FormatDateTime('yyyy-MM-dd HH:mm:ss',Now) + ' File: '+s+' not found!  '
                + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.PeerPort));
            end;
        end;
    end;
end;

解决方案3:

unit ThreadGetData;
interface
uses
  Classes, Windows, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdGlobal, SysUtils, StrUtils;
type
  ThreadGetFile = class(TThread)
  procedure IdTcpClientGetWork(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Integer);
  private
    { Private declarations }
    FSaveDir, FFileName : string;
    FIpVer : TIdIPVersion;
    IdTcpClientGet : TIdTCPClient;
    FStreamSize : Int64;
    FItemIndex : Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(FileName , SaveDir : string; aIpVer : TIdIPVersion);
  end;
implementation
uses
  Main;
{ ThreadGetFile }
function GetPort(aStr : string) : Integer; stdcall;
  begin
      Result := StrToInt(Copy(aStr,Pos(':',aStr) + 1,Pos(')',aStr) - Pos(':',aStr) - 1));
  end;
function GetHost(aStr : string) : string; stdcall;
  begin
    Result := Copy(aStr,Pos('(',aStr) + 1,Pos(':',aStr) - Pos('(',aStr) - 1);
  end;
function GetDisplayName(aStr : string) : string; stdcall;
  begin
    Result := LeftBStr(aStr,Pos('(',aStr) - 1);
  end;
constructor ThreadGetFile.Create(FileName , SaveDir : string; aIpVer : TIdIPVersion);
begin  
  FFileName := FileName;
  FItemIndex := -1;
  IdTcpClientGet := TIdTCPClient.Create(nil);
  IdTcpClientGet.OnWork := IdTcpClientGetWork;
  FIpVer := aIpVer;
  FSaveDir := SaveDir;
  inherited Create(True);
end;
procedure ThreadGetFile.IdTcpClientGetWork(ASender: TObject;
  AWorkMode: TWorkMode; AWorkCount: Integer);
begin
  //
  if FItemIndex <> -1 then
    FrmMain.Lst1.Items[FItemIndex] := '开始接收数据...' + FormatFloat('0',AWorkCount/FStreamSize*100) + '%';
end;
procedure ThreadGetFile.Execute;
var
  Size : Int64;
  CurInfo, S : string;
  FileStream : TFileStream;
  function ProDir (aDir : string) : string;
    begin
      if RightBStr(aDir,1) = '\' then
        Result := aDir
      else
        Result := aDir + '\';
    end;
begin
while CurItem < ComLst.Count do
begin
  EnterCriticalSection(Lock); //进入临界区
  CurInfo := ComLst[CurItem];
  Inc(CurItem);
  LeaveCriticalSection(Lock); //退出临界区
  with IdTcpClientGet do
    begin
      try
        Host := GetHost(CurInfo);
        Port := GetPort(CurInfo);
        IPVersion := FIpVer;
        ReadTimeout := 10000;    
        ConnectTimeout := 10000;
        OnWork := IdTcpClientGetWork;       
        Connect;
        IOHandler.WriteLn('file');
        s := IOHandler.ReadLn;
        if s = '-filename' then
          begin
            IOHandler.WriteLn(FFileName);
            s := IOHandler.ReadLn;
            if s = 'file not found' then
              begin
                //文件不存在  
                FrmMain.Lst1.Items.Add(CurInfo + ' 文件不存在! ' + FFileName);
              end
            else
              begin
                s := RightBStr(s,Length(s) - Pos(':',s));
//                s := GetDisplayName(FInfo) + s;
                FileStream := TFileStream.Create(ProDir(FSaveDir) + GetDisplayName(CurInfo) + s,
                  fmCreate);
                IOHandler.WriteLn('-size');
                s := IOHandler.ReadLn;
                Size := StrToInt64Def(s,-1);
                if Size > -1 then
                  begin
                    FrmMain.Lst1.Items.Add(CurInfo + ' 获取文件大小: ' + IntToStr(Size) + ' Byte');
                    FStreamSize := Size;
                    IOHandler.WriteLn('-ready');
                    IOHandler.LargeStream := True;
                    FItemIndex := FrmMain.Lst1.Items.Add(CurInfo + ' 开始接收数据... ');
                    IOHandler.ReadStream(FileStream,Size);
                    FItemIndex := -1;
                    FileStream.Free;
                    IOHandler.WriteLn('-ok');
                    FrmMain.Lst1.Items.Add(CurInfo + ' 文件传输完成! ' + FFileName);
                  end;
              end;
          end;
        Disconnect;
      except
        FrmMain.Lst1.Items.Add(CurInfo + ' 连接失败!');
      end;
    end;
end;
Dec(ThCount);
if ThCount = 0 then
  begin
    IdTcpClientGet.Free;
    FrmMain.Lst1.Items.Add('------------任务完成!------------');
    FrmMain.Lst1.Items.Add('');
  end;
end;


以上介绍了“ 关于delphi 使用TServerSocket 和 TClientSocket 的实现文件传输的问题100分”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3697507.html

相关图片

相关文章