功能:客户端用idtcpclient发送多个文件,服务器用idtcpserver一一接收,接收后保存在已建好的文件夹中,文件名和
发送的文件名相同。(变量fileSTR中保存要 发送的多个文件信息。如fileSTR[I]:='ja\d:\kk\d.doc',其中ja为
服务端保存文件的文件夹,d.doc为保存在该项文件夹下的文件名。即服务器收到该文件后要保有存在:
'ja\d.doc'。 下面代码中的注释部分以之为例)问题:服务端只收到第一个文件,后面发的文件收不到。请高手帮忙!谢谢!客户端发送代码:Type
TFilenameSTR=record
Filename:string[255];
End;
Var
FilenameSTR: TFilenameSTR;
FileSTR:Tstringlist;// 比如 fileSTR[I]:=’ja\d:\kk\d.doc’;
begin
try
FileSTR:=Tstringlist.create;
tempstream:=TMemoryStream.Create;
with IdTCPClient1 do
try
if Connected then Disconnect;
//不想每发一个文件连接服务器一次,
//故将 Connect()置于循环体:
//for i:=0 to fileSTR.Count-1 do之外
Connect();
for i:=0 to fileSTR.Count-1 do //遍历文件遂个发送。
begin
s1:=trim(Copy(fileSTR[i],1,Pos('\',fileSTR[i]))); //比如S1:=ja\
s2:=copy(fileSTR[i],Pos('\',fileSTR[i])+1,Length(fileSTR[i]));//比如s2:=d:\kk\d.doc
filenameSTR.filename:=s1+ExtractFileName(s2);//待发送字符串(文件头信息) ja\d.doc
tempstream.LoadFromFile(s2); //待发送的文件流
WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 : ja\d.doc
WriteStream(tempstream);//发送文件流
tempstream.Clear; //清除流并使流位置=0,为下一次发文件流作准备
end;
except
ShowMessage('发送失败!');
end;
finally
fileSTR.Free;
tempstream.Free;
//断开连接
if IdTCPClient1.Connected then IdTCPClient1.Disconnect; end;
end;服务器端代码:
procedure Tjtjs_Form.FormCreate(Sender: TObject); //开始监听
begin
IdTCPServer1.TerminateWaitTime:=30000;
IdTCPServer1.DefaultPort:=2000;
IdTCPServer1.ListenQueue:=200;
IdTCPServer1.Active:=True;
end;procedure Tjtjs_Form.IdTCPServer1Execute(AThread: TIdPeerThread);//接收文件(问题就出在这,只能接到一个文件)
type
TfilenameSTR=record //接收到的文件名
filename:string[255];
end;
var
filenameSTR:TfilenameSTR;
tempstream:TMemoryStream;
savefilename:string; //保存的文件名
begin
if (AThread.Terminated=False) and (AThread.Connection.Con_nected=true) then
begin
AThread.Connection.ReadBuffer(filenameSTR,SizeOf(filenameSTR));
tempstream:=TMemoryStream.Create;
AThread.Connection.ReadStream(tempstream,-1,True);
tempstream.Position:=0;
savefilename:=ExtractFilePath(ParamStr(0))+filenamestr.filename;
tempstream.SaveToFile(savefilename);
ComboBox1.Items.Add(savefilename);
end;
end;procedure Tjtjs_Form.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Data:=TObject(AThread.Connection.LOCALNAME);
ComboBox1.Items.Add(AThread.Connection.LocalName);
end;procedure Tjtjs_Form.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
AThread.Data:=TObject(AThread.Connection.LOCALNAME);
AThread.Connection.Disconnect;
AThread.Terminate;
AThread.Data:=nil;
end;procedure Tjtjs_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPServer1.Threads.Clear;
//IdTCPServer1.Threads.Free;
end;
发送的文件名相同。(变量fileSTR中保存要 发送的多个文件信息。如fileSTR[I]:='ja\d:\kk\d.doc',其中ja为
服务端保存文件的文件夹,d.doc为保存在该项文件夹下的文件名。即服务器收到该文件后要保有存在:
'ja\d.doc'。 下面代码中的注释部分以之为例)问题:服务端只收到第一个文件,后面发的文件收不到。请高手帮忙!谢谢!客户端发送代码:Type
TFilenameSTR=record
Filename:string[255];
End;
Var
FilenameSTR: TFilenameSTR;
FileSTR:Tstringlist;// 比如 fileSTR[I]:=’ja\d:\kk\d.doc’;
begin
try
FileSTR:=Tstringlist.create;
tempstream:=TMemoryStream.Create;
with IdTCPClient1 do
try
if Connected then Disconnect;
//不想每发一个文件连接服务器一次,
//故将 Connect()置于循环体:
//for i:=0 to fileSTR.Count-1 do之外
Connect();
for i:=0 to fileSTR.Count-1 do //遍历文件遂个发送。
begin
s1:=trim(Copy(fileSTR[i],1,Pos('\',fileSTR[i]))); //比如S1:=ja\
s2:=copy(fileSTR[i],Pos('\',fileSTR[i])+1,Length(fileSTR[i]));//比如s2:=d:\kk\d.doc
filenameSTR.filename:=s1+ExtractFileName(s2);//待发送字符串(文件头信息) ja\d.doc
tempstream.LoadFromFile(s2); //待发送的文件流
WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 : ja\d.doc
WriteStream(tempstream);//发送文件流
tempstream.Clear; //清除流并使流位置=0,为下一次发文件流作准备
end;
except
ShowMessage('发送失败!');
end;
finally
fileSTR.Free;
tempstream.Free;
//断开连接
if IdTCPClient1.Connected then IdTCPClient1.Disconnect; end;
end;服务器端代码:
procedure Tjtjs_Form.FormCreate(Sender: TObject); //开始监听
begin
IdTCPServer1.TerminateWaitTime:=30000;
IdTCPServer1.DefaultPort:=2000;
IdTCPServer1.ListenQueue:=200;
IdTCPServer1.Active:=True;
end;procedure Tjtjs_Form.IdTCPServer1Execute(AThread: TIdPeerThread);//接收文件(问题就出在这,只能接到一个文件)
type
TfilenameSTR=record //接收到的文件名
filename:string[255];
end;
var
filenameSTR:TfilenameSTR;
tempstream:TMemoryStream;
savefilename:string; //保存的文件名
begin
if (AThread.Terminated=False) and (AThread.Connection.Con_nected=true) then
begin
AThread.Connection.ReadBuffer(filenameSTR,SizeOf(filenameSTR));
tempstream:=TMemoryStream.Create;
AThread.Connection.ReadStream(tempstream,-1,True);
tempstream.Position:=0;
savefilename:=ExtractFilePath(ParamStr(0))+filenamestr.filename;
tempstream.SaveToFile(savefilename);
ComboBox1.Items.Add(savefilename);
end;
end;procedure Tjtjs_Form.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Data:=TObject(AThread.Connection.LOCALNAME);
ComboBox1.Items.Add(AThread.Connection.LocalName);
end;procedure Tjtjs_Form.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
AThread.Data:=TObject(AThread.Connection.LOCALNAME);
AThread.Connection.Disconnect;
AThread.Terminate;
AThread.Data:=nil;
end;procedure Tjtjs_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPServer1.Threads.Clear;
//IdTCPServer1.Threads.Free;
end;
解决方案 »
- 为什么我在设置 auAutoUpgrader 自动升级,打开软件后。是可以升级了。但升级了一次又
- delphi如何用WinPcap实现捕获网卡数据包?高分相送
- StringGrid如何实隔行显示不同颜色?
- 能不能把一个窗口做成模板?
- 参考了些资料后,做了个通过代理的Socket,谁能帮我测试一下?我没有测试环境
- 怎么读取一个表中的所有字段名,或者说怎样知道一个字段在不在这个表中呢?
- 在INTERBASE中有没有自动加一的字段类型?
- 请问我要选一个数组型参数,在type libary里选哪个?谢谢!
- google earth开发!! 思路!!!
- 我用Tqrshape拼了一张报表,但往上面放dbtext时,总处于下面看不到,应该如何设,使dbtext处在上层?
- delphi7下如何安装supermap objects?
- delphi 下载排队等候的问题!
for i:=0 to fileSTR.Count-1 do //遍历文件遂个发送。
begin
s1:=trim(Copy(fileSTR[i],1,Pos('\',fileSTR[i]))); //比如S1:=ja\
s2:=copy(fileSTR[i],Pos('\',fileSTR[i])+1,Length(fileSTR[i]));//比如s2:=d:\kk\d.doc
filenameSTR.filename:=s1+ExtractFileName(s2);//待发送字符串(文件头信息) ja\d.doc
tempstream.LoadFromFile(s2); //待发送的文件流
WriteBuffer(filenameSTR,SizeOf(filenameSTR)); //发送文件头信息 : ja\d.doc
WriteStream(tempstream);//发送文件流
tempstream.Clear; //清除流并使流位置=0,为下一次发文件流作准备