功能:客户端用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;
解决方案 »
- ADOQuery控件使用
- 请问我的程序每次退出时都会报一个内存错 说不能读内存块 请问如何解决
- 请问用什么函数可以输入1返回A,输入2返回B.以次类推。总之输出的字母和输入数字有对应关系即可
- 我的系统提示ODBC版本太低!我如何升级?
- 跪求用Java语言实现试卷的难度与区分度 信度评估算法的源代码
- 怎樣對數據表中的數據字段分類求累計和(即假設記錄有A、B、C三類,現對這三類記錄分別求累計和)?
- 高手请进:关于delphi中利用Word模板的问题.
- 关于MIDAS应用程序服务器的几个问题!
- 问题:比较重视技术人员的公司有哪些???
- 如何实现IE中收藏菜单项上点鼠标右键菜单并响应相应事件?
- 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,为下一次发文件流作准备