谁帮我把这个问题搞定,我分全给他了,再加上真心的感谢(200分)

  • 主题发起人 主题发起人 yourkeychen
  • 开始时间 开始时间
Y

yourkeychen

Unregistered / Unconfirmed
GUEST, unregistred user!
我的思路是把服务端的一个指定目录下所有内容(比较多的子目录),生成TreeView结构,TreeView.SaveToFile后,通过网络传送给客户端,客户端收到后直接再TreeView.LoadFromfile就还原了目录,因为可能目录结构比较大,所以在传输的时候出错,需要自己进行控制接收,可是我一直没成功。
哪位有这方面的经验或思路不妨说出来,最好是有源码,如果需要我的源码,留下Email我发给你们。
 
我有个想法:
1、在Delphi里用ZIP控件压缩指定目录下所有内容为一个ZIP文件。
2、ZIP文件从服务器到客户端可以采用流的方式进行传。
3、客户端接收到这个ZIP文件后也通过ZIP控件的解压功能进行还原。
 
用流的方式进行传送,分段发送,每个包控制在1K,接收后再合成。
 
你们别只说方法啊,我也知道要用流,要控制流量,但是我就是不知道如何实现
你们给源码说明吧,分我全给了
 
论坛上有,流的分块操作,参考一下。
以下转载:
================================================================================

来自 yanlei(2001-12-13 17:28)
Function WriteDataFieldProgress(FileName:string;Table1:TTable;FieldName:string):boolean;
var
FileStream:TFileStream;// 将入的AVI文件
BlobStream:TStream;//保存的BLOB流
//Buf: array[1..2048] of Char;
Buf: array[1..20480] of Char;
i,num:integer;
size:integer;
begin
size:=filesizebyname(FileName);

try
Application.ProcessMessages;
IF not fileexists(FileName) then
exit;
FileStream:=TFileStream.Create(FileName,fmOpenRead);
//为Table1AVI字段创建一个BLOBSTREAM
BlobStream:=table1.CreateBlobStream(table1.FieldByName(FieldName),bmReadWrite);
num:=size div 20480+1;
form1.ProgressBar1.MaxValue:=num;
//移动到STREAM的首位
BlobStream.Seek(0,soFromBeginning);


for i:=1 to num do
begin

FileStream.Read(Buf,sizeof(buf));
BlobStream.Write(Buf,sizeof(buf));
form1.ProgressBar1.Progress:=i;
application.ProcessMessages;
end;

showmessage('ok');
//释放流
FileStream.Free;
BlobStream.Free;
//添加记录
result:=true;
except
end;

end;
 
不太明白,可不可以生成txt文件在传收呢?
 
无所谓什么格式,只要能传过去,并被客户端正确接收还原就行了。

To angelgekko:

你只说了发送啊,接收端怎么办呢?要知道发送还简单一些,接收那边就麻烦多了。如果在我发送的过程中,又有亲的连接,怎么办呢?这个发送会不会中断?会不会将本该发给N客户的数据剩下的部分发给了N+1客户呢?请你再给我补充一下行吧?
 
其实就是c/s两端一应一答的传送数据,我这有个例子好像和你要求的差不多,要得话留个mail
 
楼主,以上程序说明的是把 FileStream 分块写入 BlobStream 啊!
同样道理!
 
你原来的监听端设计有问题,网络监听要设计成多线程的,也就是用一个线程保持着监听,一旦接收到消息,就创建一个线程来处理,而原来的线程仍然保持着监听。新的线程在传送完毕后就将其关闭。
 
TO:迷糊
要,当然要,我现在就为这个急呢
yourkeychen@163.net
 
To : hhaibin,
可不可以告诉我多线程如何实现,举例在我的这个实际需求例子中帮我说明一下
非常感谢。
 
好想你还发了帖子吧,我在另一个帖子里面给你答案了,你却开新贴了...
 
DELPHI自带的TSocketCliet本来就是多线程的.
 
来自:天若无痕, 时间:2003-9-10 15:48:00, ID:2169932 | 编辑
我有代码,不过在备份光盘,我简单说明:
服务端:
//假设ASendStr是要传输的字符串,即你的listview的组合字符串
procedure Send(ASendStr: string);
var
sTmp:string;
begin
sTmp := ASendStr + #12#13#14#15#16#17#18;
Socket.Send(sTmp);
end;

客户端:
var
sTmp: string;
procedure Receive(ARevStr: string);
begin
sTmp := sTmp + ArevStr;
if FindStr(ARevStr, #12#13#14#15#16#17#18) = true then
//说明:FindStr为搜索字符串函数,我忘记了,暂时胡乱替代
//找到这个#12#13#14#15#16#17#18串后,就可以把这个串之前前的字符串取出来
//例如'ABC'+#12#13#14#15#16#17#18+'DE',你取到就是ABC
//加上Sockt每次获取的字符串,就成为完整的一个字符串,你就可以解析了.
begin
FXString(sTmp); //这里就是你的分析函数
sTmp := '';
sTmp := 这里是#12#13#14#15#16#17#18之后的数据;
//例如'ABC'+#12#13#14#15#16#17#18+'DE',你取到的就是'DE'
end;
end;
//注意,在你的sockt控件的接收方法里面调用Receive即可.

 
to:天若无痕
是的,我在其他贴子也问了这个问题
我用你的方法去试试
如果行的通,我马上把分给
如果行不通,我一样的谢谢你
 
偶的网站上有两个传送文件的例子(分别用UDP和WinSock),还有生成文件夹树的控件
http://www.aidelphi.com,在源码及文档下载版块.
 
To : 天若无痕
你给我发代码没有?你的邮箱是多少?你的QQ是多少?
我怎么一直没有收到?麻烦你查查
 
当然要分块操作啦,
接收成功后,最好弄个Crc32验正
 
后退
顶部