关于网友提出的“ 关于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