关于局域网内文件传输的特大问题,我已检索过,很少有人谈到!(150分)

  • 主题发起人 主题发起人 norton
  • 开始时间 开始时间
N

norton

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在局域网内,传输文件(可以看作二进制文件,比如:数据库的表文件),现用以下程序段实现及其出现的问题:
1。用nmstrm,和nmstrmserv 及 nmuuprocessor mime编码实现。
//发送端:
procedure TForm1.Button1Click(Sender: TObject);
var
input:TFileStream;
output:TFileStream;
send:TFilestream;
temp:string;
begin
opendialog1.Execute;
input:=TFileStream.Create(opendialog1.FileName,fmOpenRead);
output:=TFileStream.Create('c:/temp/send.tmp',fmCreate);
nmuuprocessor1.InputStream:=input;
nmuuprocessor1.OutputStream:=output;
nmuuprocessor1.Encode;
output.Seek(sofrombeginning,0);
input.Free;
output.Free;
send:=TFileStream.Create('c:/temp/send.tmp',fmOpenRead);
temp:=nmstrm1.PostIt(send);
send.Free;
showmessage(temp);
end;
//接收端:
procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
input:TFileStream;
output:TFileStream;
receive:TFileStream;
begin
receive:=TFileStream.Create('c:/temp/receive.tmp',fmCreate);
receive.CopyFrom(strm,strm.size);
receive.Free;
input:=TFileStream.Create('c:/temp/receive.tmp',fmopenread);
savedialog1.Execute;
output:=TFilestream.Create(savedialog1.FileName,fmCreate);
nmuuprocessor1.InputStream:=input;
nmuuprocessor1.OutputStream:=output;
nmuuprocessor1.Decode;
input.Free;
output.Free;
end;
出现的问题:我先发送一WORD文件(700K左右,用uuprocessor 编码后,有
1M左右,但发送没有问题,但经不起多次发送。发送一可执行文件(400K),
经uuprocessor编码后,有600K左右,点击发送,没有反应,postit也不返回
‘ok’。
2.用tserversocket 和 tclientsocket实现。
//两者在同一程序段内》
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
statusbar1.SimplePanel:=True;
statusbar1.SimpleText:='connected!';
end;
//监听按钮
procedure TForm1.Button1Click(Sender: TObject);
begin
serversocket1.Active:=True;
end;
//发送按钮
procedure TForm1.sendClick(Sender: TObject);
var
send:TFilestream;
begin
opendialog1.Execute;
send:=TFileStream.Create(opendialog1.filename,fmopenread);


serversocket1.Socket.Connections[0].sendstream(send);
serversocket1.socket.Connections[0].sendtext('ok');
send.free;
end;
//客户段接收
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
len:integer;
msg:string;
b:array [1..10000] of byte;
begin
with clientsocket1 do
begin
len:=Socket.ReceiveLength;
if len=2 then
begin
msg:=socket.ReceiveText;
if comparestr(msg,'ok')=0 then
begin
receive.Seek(sofrombeginning,0);
receive.Free;
showmessage('ok');
end;
end
else
begin
socket.ReceiveBuf(b,len);
receive.Write(b,len);
end;

end;

end;
//客户段连接按钮
procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Open;
receive:=TFileStream.Create('c:/temp/receive',fmcreate);
end;
当发送先前WORD文档时,多次激活clientsocketread事件,看来是要进行
数据拼接 ,但经过两次后,出现‘access violation at adress xxxx'
错误。
3。用nmudp广播,本地地址:192.100.100.1,广播地址:192.100.100.255
但从某本书上得知:nmudp每个数据包只能为2k,要多次拼接。只好做罢。
有那位大虾,有兴趣可补上,我也写了,但也调不通,出现问题与2程序段
出现问题差不多。
以上是,问题,程序段中某些考虑不周全的地方,请见凉,因为我项先实现
功能。请诸位大虾,指点一二。送上150分,因为I'm poor!我是非常急!
因为我不能用ftp服务器,所以nmftp作罢。
 
几点意见:
1. 用NM的Stream来发送大文件效率不高,原因有二:一是要编码解码,
二是当接收端全部接到之后才产生事件通知程序存盘,不如一边接收
一边存储效率高

2。用Socket传文件:
同样不要再用Stream了,简单地顺序读取文件传送即可,用阻塞模式
或者非阻塞模式均可,阻塞模式简单一些

如若还搞不定发个消息,我晚上用Socket做一个试试
 
for pegasus:
please help me!
 
还不如架个FTP Server专管传文件算啦,

不超过30行代码.
 
不用ftp的原因是传输好文件之后你的接收文件的程序不容易立刻知道
 
既然在局域网内.为什么不直接文件拷贝呢? 那速度多块!
 
我也想了解一下,我直接利用DELPHI3中的CHART例子,添加了发送STREAM数据
如同norton兄,但也不起作用
 
for:曹晓刚:
你手头有这样的程序吗?
可否mail to ocean.su@263.net
thanks
 
for cakk:
你的方法能用程序实现吗?
 
我指的是在接收机的后台启动一个象serv-U之类的标准FTP软件,
传送文件的时候就把文件生成或者放在FTP的目录下,就是相当于
Upload啦。
(要是接收机程序不知道,就发个socket消息通知他传完了。)

所以你问我要源程序,那有什么源程序啊,都是现成的。
至于发送端么,就用FreeNet里的TSimpleFTP啊。三行代码。
要是你是D4,就直接用里面带的FTP就可以了。据Seasky说也可以只用三行代码。

我觉得这个方法除了在异构机器(win/unix)之间使用,如果是局域网的话,
还不如直接传送呢。(如cAkk)

要是你要TSimpleFTP,我就寄给你。
 
各位:
是这样,客户端运行我别的程序,我想在服务器端,将数据库的表拷贝到客户端,
如果用直接拷贝,涉及到取网络路径,我该怎模办。
 
copyfile(pchar('e:/fsgs.log'),pchar('//butterfly/shared/fsgs.log'),LongBool(FALSE));

不过我说,用分布式数据库不就得了?比如interbase,SQL server;
 
for 曹晓钢:
no!我的客户端不止一个!要发给客户端,也得解决取网上邻居得路径问题。我也想过,用sql server,但一个D版interbase仅支持five用户!为了给老板省钱吗!
 
咦,难道你不知道每台机器的路径?
或者每台机器启动的时候先登记; 或者先用Net命令得到当前的机器,看有那些在就发。
 
直接用copyfile,client端调用API监视文件目录的变化。

局域网编程最简单,用什么笨办法都可以,反正带宽足够。
 

怎样监视目录变化。要是用户将客户端安装到不同目录下怎么办,要是客户端
没将目录共享,我还能用copyfile吗。怎么让一个目录共享哪?
我想提供给用户最大的灵活性。
 
用监视目录的问题是系统经常不能监视某个目录,这我碰到过数次,所以
不是很可靠,
如果想简化,那么就这样:
使用网络邻居映射要拷贝的目标目录,
拷贝完文件之后,用你原先的程序通过Socket发送一个提示消息就行了
 
请接受答案或继续提问
 
有没有哪位大侠可以提供一个拼接的例子
 
我写过这方面的程序,一个是直接修改DELPHI中的CHAT例子,一个是UDP组件实现的。 两个程序不但可以应用于局域网,也能应用于Internet。在局域网中的速度是
每秒种100-200KB,在互连网中的速度仅是1KB多一点,达不到2KB。现在正针对互连
网来修改程序,完成后可送你一套。
 
后退
顶部