我的思路是这样的:
1.Client/Server在同一个应用程序中。
2.Client发送“transfer”命令,Server做出回应,如果回应为“OK”,则Client将文件读入,开始传送,Server接受文件。由于是初学者,对Indy组件不太了解,花了好多时间都没弄好,请大家帮帮忙。我的源程序如下(连接没有问题):unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
RemoteIP: TLabeledEdit;
Connect: TBitBtn;
Transfer: TBitBtn;
OpenDialog: TOpenDialog;
IdTCPClient: TIdTCPClient;
IdTCPServer: TIdTCPServer;
SaveDialog: TSaveDialog;
procedure ConnectClick(Sender: TObject);
procedure TransferClick(Sender: TObject);
procedure IdTCPServertransferCommand(ASender: TIdCommand);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SFileName:TFileName;
DFileName:TFileName;
fstream:TFileStream;
stream:TFileStream;implementation{$R *.dfm}procedure TForm1.ConnectClick(Sender: TObject);
begin
try
IdTCPClient.Host:=RemoteIP.Text;
IdTCPClient.Connect;
except
ShowMessage('服务器连接错误');
end;
Transfer.Enabled:=true;
end;procedure TForm1.TransferClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
SFileName:=OpenDialog.FileName;
IdTCPClient.SendCmd('transfer');
if IdTCPClient.LastCmdResult.Text.Text='OK' then
begin
fstream:=TfileStream.Create(SFileName,fmOpenRead);
IdTCPClient.WriteStream(fstream,true,true);
end;
fstream.free;
end;
end;procedure TForm1.IdTCPServertransferCommand(ASender: TIdCommand);
begin
if SaveDialog.Execute then
begin
DFileName:=SaveDialog.FileName;
stream:=TFileStream.Create(DFileName,fmCreate);
try
ASender.Response.Text:='OK';
ASender.Thread.Connection.ReadStream(stream);
finally
stream.free;
end;
end;
end;
end.
1.Client/Server在同一个应用程序中。
2.Client发送“transfer”命令,Server做出回应,如果回应为“OK”,则Client将文件读入,开始传送,Server接受文件。由于是初学者,对Indy组件不太了解,花了好多时间都没弄好,请大家帮帮忙。我的源程序如下(连接没有问题):unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
RemoteIP: TLabeledEdit;
Connect: TBitBtn;
Transfer: TBitBtn;
OpenDialog: TOpenDialog;
IdTCPClient: TIdTCPClient;
IdTCPServer: TIdTCPServer;
SaveDialog: TSaveDialog;
procedure ConnectClick(Sender: TObject);
procedure TransferClick(Sender: TObject);
procedure IdTCPServertransferCommand(ASender: TIdCommand);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SFileName:TFileName;
DFileName:TFileName;
fstream:TFileStream;
stream:TFileStream;implementation{$R *.dfm}procedure TForm1.ConnectClick(Sender: TObject);
begin
try
IdTCPClient.Host:=RemoteIP.Text;
IdTCPClient.Connect;
except
ShowMessage('服务器连接错误');
end;
Transfer.Enabled:=true;
end;procedure TForm1.TransferClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
SFileName:=OpenDialog.FileName;
IdTCPClient.SendCmd('transfer');
if IdTCPClient.LastCmdResult.Text.Text='OK' then
begin
fstream:=TfileStream.Create(SFileName,fmOpenRead);
IdTCPClient.WriteStream(fstream,true,true);
end;
fstream.free;
end;
end;procedure TForm1.IdTCPServertransferCommand(ASender: TIdCommand);
begin
if SaveDialog.Execute then
begin
DFileName:=SaveDialog.FileName;
stream:=TFileStream.Create(DFileName,fmCreate);
try
ASender.Response.Text:='OK';
ASender.Thread.Connection.ReadStream(stream);
finally
stream.free;
end;
end;
end;
end.
//传送过30M的文件,测试通过
//客户端
unit client;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ScktComp;type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
ProgressBar2: TProgressBar;
Edit3: TEdit;
Edit1: TEdit;
Edit2: TEdit;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
function getfilename(str1:string):string;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; type
FileInf=Record
name: String; //文件名
Size: Integer; //文件大小
sfile: TFileStream; //文件
end;
var
Form1: TForm1;
mem: fileinf;
posi, len: Integer;
implementation{$R *.DFM}procedure TForm1.Button3Click(Sender: TObject);
begin
if ClientSocket1.Active then
ClientSocket1.Active:=false;
application.Terminate;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if ClientSocket1.active then clientsocket1.Active:=false;
ClientSocket1.Host:= edit1.Text;
ClientSocket1.Port:= StrToInt(edit2.Text);
clientsocket1.active:=true;
// ClientSocket1.Active:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Opendialog1.Execute then
begin
edit3.Text:= Opendialog1.FileName;
mem.name:= getfilename(Opendialog1.FileName);
end;
end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.lines.Add('C: 正在链接...');
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
p: Array[0..1023] of byte;
RecStr: String;
begin
RecStr:= ClientSocket1.Socket.ReceiveText;
// Memo1.Lines.Add('S: '+RecStr);
if Pos('连接成功', RecStr)> 0 then
begin
Memo1.Lines.Add('连接成功');
Memo1.Lines.Add('C: 提交文件名');
ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
end; if Pos('成功收到文件名', RecStr)> 0 then
begin
posi:=0;
len:=0;
Try
mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
mem.Size:= mem.sfile.Size;
Posi:= 0;
Memo1.Lines.Add('C: 提交文件大小');
ClientSocket1.Socket.SendText('提交文件大小: '+IntToStr(mem.size));
finally
// mem.sfile.Free;
end;
end;//end if if Pos('成功收到文件大小', RecStr)> 0 then
begin
Memo1.Lines.Add('C: 开始发送文件');
ClientSocket1.Socket.SendText('开始发送文件');
end; if (Pos('可以发送', RecStr)> 0) or (Pos('继续发送', RecStr)> 0) then
begin
try
//recfile:= TFileStream.Create(mem.name, fmOpenRead);
if Posi< mem.Size then
begin
len:= 1024;
if mem.Size-posi< 1024 then len:= mem.Size-posi;
mem.sfile.Position:=posi;
mem.sfile.ReadBuffer(p,len);
// mem.sfile.read(p,len);
ClientSocket1.Socket.SendBuf(p,len);
// memo1.lines.add('当前位置:'+inttostr(posi)+',长度:'+inttostr(len));
if ProgressBar2.Position<>Round(posi/mem.Size*100) then
Application.ProcessMessages;
ProgressBar2.Position:= Round(posi/mem.Size*100);
inc(posi, len);
end;
finally
//mem.sfile.Free;
//mem.sfile:=nil;
end;
end; if Pos('文件接收失败', RecStr)> 0 then
begin
Memo1.Lines.Add('C: 重新提交文件名');
ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
end; if Pos('成功接收文件', RecStr)> 0 then
begin
mem.sfile.Free;
mem.sfile:=nil;
Memo1.Lines.Add('C: 发送文件结束');
ClientSocket1.Socket.SendText('发送文件结束');
end;
end;function TForm1.getfilename(str1:string):string;
var
myi:integer;
str2:string;
begin
str2:='';
if length(str1)=0 then result:=''
else
begin
if pos('\',str1)<1 then result:=str1
else
begin
for myi:=length(str1) downto 1 do
begin
if str1[myi]='\' then Break;
str2:=str1[myi]+str2;
end;
result:=str2;
end;
end;
end;
end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ScktComp;type
TForm1 = class(TForm)
Button2: TButton;
Memo1: TMemo;
ProgressBar1: TProgressBar;
ServerSocket1: TServerSocket;
procedure Button2Click(Sender: TObject);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Sendf: boolean;
filename:String;
filesize:integer;
recfile: TFileStream;
ReadCount : integer;
implementation{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
begin if ServerSocket1.Active then
ServerSocket1.Active:= False;
application.Terminate;
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText('连接成功...');end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
recStr: String;
Buffer : pointer;
nRetr : integer;
const
bufferSize = 1024 ;begin
if not sendf then
begin
RecStr:= socket.ReceiveText;
memo1.Lines.add(recstr);
end;
if Pos('提交文件名', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件名: '));
filename:='c:\'+RecStr;
socket.SendText('成功收到文件名');
end; if Pos('提交文件大小', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件大小: '));
fileSize:=StrToIntDef(RecStr,0);
if FileExists(Filename) then Deletefile(filename);
recfile :=TFileStream.Create(filename,fmCreate or fmShareDenyNone);
if recfile<>nil then
begin
recfile.Free;
recfile:= nil;
end;
socket.SendText('成功收到文件大小');
end; if sendf then
begin
GetMem(Buffer,BufferSize);
nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
inc(readcount, nretr);
ProgressBar1.Position:= Round(readcount/filesize*100);
Application.ProcessMessages; if FIleExists(filename) then
begin
recfile :=TFileStream.Create(filename,fmOpenWrite or fmShareDenyNone);
recfile.Seek(0,soFromEnd);
end;
recfile.write(Buffer^,nRetr);
FreeMem(Buffer);
recfile.Free;
recfile:= nil; if readcount=filesize then
begin
memo1.Lines.add('成功接收文件');
socket.SendText('成功接收文件');
recfile.Free;
recfile:=nil;
sendf:=false;
end
else socket.SendText('继续发送');
end; if Pos('开始发送文件', RecStr)>0 then
begin
socket.SendText('可以发送');
ReadCount:=0;
sendf:=true;
end;
end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('客户已停止链接');
end;procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showmessage('客户已出错');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
serversocket1.Close;
end;end.