这两天编写文件传输的程序碰到些问题还请大家帮帮忙。使用INDY 9.0的IDTcpClient和IDTcpServer控件,Ddelphi 7。客户端向服务器端发文件: 问题1:客户端可以发文件,但服务器端接收不到?
问题2:怎样实现多文件传输?
问题3:发文件怎样实现断点续传?
只要问题解决,分不够可令开帖加。
源代码:
======================================
客户端:unit Client;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Panel2: TPanel;
Edit3: TEdit;
Button1: TButton;
Gauge1: TGauge;
Panel3: TPanel;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
IdTCPClient1: TIdTCPClient;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;type
FileInf=Record
name: String; //文件名
Size: Integer; //文件大小
sfile: TFileStream; //文件
end;var
Form1: TForm1;implementation{$R *.dfm}
var
mem: fileinf;procedure TForm1.Button3Click(Sender: TObject);
begin
if idtcpclient1.Connected then
idtcpclient1.Disconnect;
application.Terminate;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Opendialog1.Execute then
begin
edit3.Text:= Opendialog1.FileName;
mem.name:= Opendialog1.FileName;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
p: Array[0..1023] of byte;
posi, len: Integer;
RecStr: String;
begin
with IdTcpClient1 do
begin
Host:= edit1.Text;
Port:= StrToInt(edit2.Text);
Connect(5);
end; if idtcpclient1.Connected then
begin
RecStr:= IdTcpClient1.ReadLn;
Memo1.Lines.Add('S: '+RecStr); Memo1.Lines.Add('C: 提交文件名');
idTcpClient1.WriteLn('提交文件名: '+mem.name);
RecStr:= IdTcpClient1.Readln;
Memo1.Lines.Add('S: '+ RecStr);
if Pos('成功收到文件名', RecStr)> 0 then
begin
mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
Try
mem.Size:= mem.sfile.Size;
Posi:= 0;
Memo1.Lines.Add('C: 提交文件大小');
idTcpClient1.WriteLn('提交文件大小: '+IntToStr(mem.size));
RecStr:= idTcpClient1.Readln;
Memo1.Lines.Add('S: '+ RecStr);
if Pos('成功收到文件大小', RecStr)> 0 then
begin
Memo1.Lines.Add('C: 开始发送文件');
idtcpclient1.WriteLn('开始发送文件'); While Posi< mem.Size do
begin
len:= 1024;
if mem.Size-posi< 1024 then len:= mem.Size-posi;
mem.sfile.Read(p, len);
idTcpClient1.WriteBuffer(p, len);
inc(posi, len);
Gauge1.Progress:= Round(posi/mem.Size*100);
Application.ProcessMessages;
end; Memo1.Lines.Add('C: 发送文件结束');
idtcpclient1.WriteLn('发送文件结束');
RecStr:= idTcpClient1.ReadLn;
Memo1.lines.Add('S: '+ RecStr);
end;
finally
mem.sfile.Free;
end;
end;
end; IdTcpClient1.Disconnect;
end;end.======================================
服务器端:unit Server;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Gauges, IdBaseComponent, IdComponent,
IdTCPServer;type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Panel2: TPanel;
Edit2: TEdit;
Gauge1: TGauge;
Label2: TLabel;
SaveDialog1: TSaveDialog;
IdTCPServer1: TIdTCPServer;
Panel3: TPanel;
Memo1: TMemo;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Active' then
begin
Button1.Caption := 'Stop';
idTcpServer1.DefaultPort:= StrToInt(edit1.Text);
idtcpserver1.Active := true;
end
else begin
Button1.Caption := 'Active';
idtcpserver1.Active := false;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
if idtcpServer1.Active then
idtcpServer1.Active:= False;
application.Terminate;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
button1Click(self);
end;procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Connection.Writeln('连接成功...');
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
recStr: String;
filename:String;
filesize:integer;
recfile: TFileStream;
begin
filesize:= 0;
recfile:= nil;
RecStr:= AThread.Connection.ReadLn;
if Pos('提交文件名', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件名: '));
filename:=RecStr;
AThread.Connection.WriteLn('成功收到文件名');
end
else if Pos('提交文件大小', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件大小: '));
fileSize:=StrToIntDef(RecStr,0); savedialog1.FileName:= fileName;
if SaveDialog1.Execute then
begin
filename:= SaveDialog1.FileName;
if FileExists(Filename) then Deletefile(filename);
if recfile<>nil then
begin
recfile.Free;
recfile:= nil;
end;
if not fileExists(filename) then
recfile:= TFileStream.Create(filename, fmOpenReadWrite or fmCreate)
else
recfile:= TFileStream.Create(filename, fmOpenReadWrite);
end; AThread.Connection.WriteLn('成功收到文件大小');
end
//else if Pos('开始发送文件', RecStr)>0 then
//begin
//
//end
else if Pos('发送文件结束', RecStr)>0 then
begin
if recfile<>nil then
begin
recfile.Free;
recfile:= nil;
AThread.Connection.WriteLn('文件接收成功');
end;
filename:= '';
filesize:= 0;
end
else
begin
if recfile<>nil then
begin
recfile.Seek(0,2);
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(recfile);
AThread.Connection.CloseWriteBuffer;
Gauge1.Progress:= Round(recfile.size/filesize*100);
Application.ProcessMessages;
end;
end;
end;end.
问题2:怎样实现多文件传输?
问题3:发文件怎样实现断点续传?
只要问题解决,分不够可令开帖加。
源代码:
======================================
客户端:unit Client;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Panel2: TPanel;
Edit3: TEdit;
Button1: TButton;
Gauge1: TGauge;
Panel3: TPanel;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
IdTCPClient1: TIdTCPClient;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;type
FileInf=Record
name: String; //文件名
Size: Integer; //文件大小
sfile: TFileStream; //文件
end;var
Form1: TForm1;implementation{$R *.dfm}
var
mem: fileinf;procedure TForm1.Button3Click(Sender: TObject);
begin
if idtcpclient1.Connected then
idtcpclient1.Disconnect;
application.Terminate;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Opendialog1.Execute then
begin
edit3.Text:= Opendialog1.FileName;
mem.name:= Opendialog1.FileName;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
p: Array[0..1023] of byte;
posi, len: Integer;
RecStr: String;
begin
with IdTcpClient1 do
begin
Host:= edit1.Text;
Port:= StrToInt(edit2.Text);
Connect(5);
end; if idtcpclient1.Connected then
begin
RecStr:= IdTcpClient1.ReadLn;
Memo1.Lines.Add('S: '+RecStr); Memo1.Lines.Add('C: 提交文件名');
idTcpClient1.WriteLn('提交文件名: '+mem.name);
RecStr:= IdTcpClient1.Readln;
Memo1.Lines.Add('S: '+ RecStr);
if Pos('成功收到文件名', RecStr)> 0 then
begin
mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
Try
mem.Size:= mem.sfile.Size;
Posi:= 0;
Memo1.Lines.Add('C: 提交文件大小');
idTcpClient1.WriteLn('提交文件大小: '+IntToStr(mem.size));
RecStr:= idTcpClient1.Readln;
Memo1.Lines.Add('S: '+ RecStr);
if Pos('成功收到文件大小', RecStr)> 0 then
begin
Memo1.Lines.Add('C: 开始发送文件');
idtcpclient1.WriteLn('开始发送文件'); While Posi< mem.Size do
begin
len:= 1024;
if mem.Size-posi< 1024 then len:= mem.Size-posi;
mem.sfile.Read(p, len);
idTcpClient1.WriteBuffer(p, len);
inc(posi, len);
Gauge1.Progress:= Round(posi/mem.Size*100);
Application.ProcessMessages;
end; Memo1.Lines.Add('C: 发送文件结束');
idtcpclient1.WriteLn('发送文件结束');
RecStr:= idTcpClient1.ReadLn;
Memo1.lines.Add('S: '+ RecStr);
end;
finally
mem.sfile.Free;
end;
end;
end; IdTcpClient1.Disconnect;
end;end.======================================
服务器端:unit Server;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Gauges, IdBaseComponent, IdComponent,
IdTCPServer;type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Panel2: TPanel;
Edit2: TEdit;
Gauge1: TGauge;
Label2: TLabel;
SaveDialog1: TSaveDialog;
IdTCPServer1: TIdTCPServer;
Panel3: TPanel;
Memo1: TMemo;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Active' then
begin
Button1.Caption := 'Stop';
idTcpServer1.DefaultPort:= StrToInt(edit1.Text);
idtcpserver1.Active := true;
end
else begin
Button1.Caption := 'Active';
idtcpserver1.Active := false;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
if idtcpServer1.Active then
idtcpServer1.Active:= False;
application.Terminate;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
button1Click(self);
end;procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Connection.Writeln('连接成功...');
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
recStr: String;
filename:String;
filesize:integer;
recfile: TFileStream;
begin
filesize:= 0;
recfile:= nil;
RecStr:= AThread.Connection.ReadLn;
if Pos('提交文件名', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件名: '));
filename:=RecStr;
AThread.Connection.WriteLn('成功收到文件名');
end
else if Pos('提交文件大小', RecStr)>0 then
begin
delete(RecStr, 1, length('提交文件大小: '));
fileSize:=StrToIntDef(RecStr,0); savedialog1.FileName:= fileName;
if SaveDialog1.Execute then
begin
filename:= SaveDialog1.FileName;
if FileExists(Filename) then Deletefile(filename);
if recfile<>nil then
begin
recfile.Free;
recfile:= nil;
end;
if not fileExists(filename) then
recfile:= TFileStream.Create(filename, fmOpenReadWrite or fmCreate)
else
recfile:= TFileStream.Create(filename, fmOpenReadWrite);
end; AThread.Connection.WriteLn('成功收到文件大小');
end
//else if Pos('开始发送文件', RecStr)>0 then
//begin
//
//end
else if Pos('发送文件结束', RecStr)>0 then
begin
if recfile<>nil then
begin
recfile.Free;
recfile:= nil;
AThread.Connection.WriteLn('文件接收成功');
end;
filename:= '';
filesize:= 0;
end
else
begin
if recfile<>nil then
begin
recfile.Seek(0,2);
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(recfile);
AThread.Connection.CloseWriteBuffer;
Gauge1.Progress:= Round(recfile.size/filesize*100);
Application.ProcessMessages;
end;
end;
end;end.
解决方案 »
- 请问用TSimpleDataSet更新数据库怎么知道是否更新成功?
- 求Delphi5(精简版也可),多谢
- 当Form1.style:=bsSizeable时,Form1.Icon设计时为(None),可运行时却自动加了Application的运行图标,请问如何去掉这个“自作多情”的图
- 超级菜鸟 问备份问题 在线等
- 折腾了一天还是没有结果,头大中~~~~~~
- 急:TWebBrowser控件如何消除右边那条难看的ScrollBar
- 大家给点意见
- 模仿草鸡结巴的功能
- 如何自己编写appid?
- 我用winamp播放mp3时,音频属性中的wave项的平衡设置每播完一首歌曲自动回到最左边,音量也自动调到最小,怎么办?
- 窗体上有四幅图象,单击其中一幅图象时,如何实现在该图象周围画一黄颜色的边框?
- 有关报表和打印的问题!
http://218.56.11.178:8020/web/index.aspx-》下载基地-》例程-网络技术-》演示TCP通讯服务/客户的连接参考一下吧
OpenWriteBuffer;
clearwritebuffer;
WriteStream(TStream);
CloseWriteBuffer;
在服务器端Tcpserver.onexecute事件里使用readstream接收。
麻烦你再从发一下吧。