三层中,如何把任意文件在客户端和中间层之间互相传递? (300分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
出于某种原因,需要:
(1)把某些文件从客户端传到中间层;
(2)又要把另外一些文件从中间层传到客户端。
究竟用什么方法实现,效率比较高?
 
用scoket 传
 
我的三层是用SocketConnection的。
 
增加接口方法,通过VARIANT参数传,即使用其它连接方式也能用。
 
管它什么文件,以流的形式读入,然后通过variant来传递。
 
大虾们,给点源代码啊!
我是超级大菜鸟!
 
》honestman, 时间:2001-11-8 8:15:00, ID:714965
》大虾们,给点源代码啊!
在中间层TLB一个方法,然后客户端通过SockConnction调用,原代码在Demo中有
》我是超级大菜鸟!
呵呵,那我更是了。
 
我是指用流传递几M的文件的源代码。
最好可以分段传,让客户可以看着进度条。
 
我在用BCB5做多层结构系统时,我在Server端加入了一个取得服务器IP地址的方法:GetServerIP它的参数是vIP:Variant *,IN方式,并在服务端实现了这个方法,
加入的代码如下:
*vIP="192.168.0.01";最后我注册成功。
可是在我开发客户端程序时,我用TSocketConnection
当取得它的服务时我是这样做的:
Variant* vip;
SocketConnection1->AppServer.GetServerIP(vip);
Edit1->Tex=vip;
可 是我在运行程序时出错,没有编译通过。
它说getserverIP不是variant的成员
getserverIP is not a memober of variant
请问?
我该如何去调用这个方法呢?
请各位大侠多多指教?
小生的QQ:65466700(24小时在线恭候)
MAIL: alongsun@sina.com
 
什么都别用,就用FTP吧。方便。
 
同意txmaster的意见,如果要传送大文件的话,自己写代码并不是最好的办法
干脆就扔两个Ftp控件上去,把传输文件的工作都交给它好了。
不过我没在实际项目中做过,只是个想法
大家可以讨论一下的。
 
我用过Ftp实现,
是可行的。
 
不用什么,在中间件加入一个方法就可实现:
server:
function GetFile(const FileName: string): OleVariant;
var
P: Pointer;
begin
VarClear(Result);//不知D5有没。
with TFileStream.Create(FileName, fmShareDenyNone)do
try
Result := VarArrayCreate([0, Size], varByte);
P := VarArrayLock(Result);
Read(P^, Size);
finally
Free;
VarArrayUnLock(Result);
end;
end;

client;
procedure GetFile(const FileName: string);
var
P: Pointer;
Data: OleVariant;
Count: Integer;
begin
Data := SocketConnection1.AppServer.GetFile(FileName);
with TFileStream.Create('c:/temp/'+ ExtractFileName(FileName), fmCreate)do
try
P := VarArrayLock(Data);
Count := VarArrayHighBound(Data, 1);
Write(P^, Count);
finally
Free;
VarArrayUnLock(Data);
end;
end;
 
To copy_paste:
如果要传递的程序超过 3-4 MB,客户端会出错的,不知道有没有办法解决?
 
appsvr加入一个方法,每次调用写入一定长度的数据(用数组),比如 1k ,不要一次传整个文件
 
可以这样试试加入一些方法,如开始传文件,读文件块,结束。
//记录一些信息维护ReadFileBlock,EndTranFile再将它reset
procedure begin
TranFile(FileName: WideString);
procedure ReadFileBlock(var Data: OleVariant);
procedure EndTranFile;
因为TSocketConnection传输数据都是用内存流,如果因传输的数据大于内存的话,就不行了
 
我前段写了关于TSOcketConnection的扩展,不过还有一些Bug,基本可以达到贴主的要求,
传输文件只会在内存不够的时候(我的机器128M,传29M时出问题),我想可能要改
TDataBlock类,不用内存流,用文件Read/Write,不过现在没需要了,可以参考参考。
http://www.csdn.net/filebbs/read_topic.asp?id=992
 
俄用的方法是通过数据库传先把文件以流的形式存入数据库的blob字段,然后在客户端还原出来.
数据库自身可以解决文件大小的问题.
 
copy_paste和程序很清晰,对你应该很有用。
 
后退
顶部