网络文件传输的问题.(100分)

  • 主题发起人 主题发起人 chonsee
  • 开始时间 开始时间
C

chonsee

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一次利用nmudp控件进行文件传输编程中,当文件很大时(比如几十MB)
传输到一定的程度就会产生内存溢出的问题,而且问题只存在接收方.
下面是我在接收端的nmudp控件的接收数据事件中写的一段代码
tempstream.clear;//tempstream是一个tmemorystream已经创建,先清除.
tempstream.Position :=0;
nmudp1.RemoteHost:=fromip;
nmudp1.ReadStream(tempstream);
temp.CopyFrom(tempstream,tempstream.size);//temp也是一个tmemorystream已//经创建,保存接收所有流.
nmudp1.Sendbuffer(buffer1,length(buffer1));//发一些信息给对方,进行来回//传.
我在发送端先将文件存在一个tmemorystream中,然后发送流.可是没有产生
那样的问题.delphi 5中有一些控件好像直接提供了sendfile操作,但是
小弟不知道怎么使.
我还想问一下nmudp发送数据是不是最大为2K
望高高手指点.
 
NMStrm1

NMStrmServ1
直接传送文件的!
 
我用过了,好像不行.能不能具体一点?
 
我试过的
可以的啊

给你一个用SOCKET传送大文件的例子
用C++ Builder实现的,和Delphi一样

传送过程:

1.Client向Server传送文件名;

2.Server向Client传送文件大小;

3.Client向Server传送"GetFile";

4.开始传送;



由于前文所述的原因,我每次只写入10M,程序如下:



//发送端

void __fastcall TForm1::sckServerClientRead(TObject *Sender,

TCustomWinSocket *Socket)

{

AnsiString strData;

if(SendFile){

strData = Socket->ReceiveText();

Label1->Caption = "传送文件";

int bufSize, byteSend, byteTotalSend;

byteTotalSend = 0;

while(byteTotalSend < srcFileSize){

if (srcFileSize <= SendBlock * SendCount){ //分段传输

bufSize = srcFileSize - SendBlock * (SendCount-1);

buf = new char[bufSize];

FileRead(srcFileHandle,buf,bufSize);

do{

Application->ProcessMessages();

byteSend = Socket->SendBuf(buf,bufSize);

}while(byteSend == -1);

byteTotalSend += byteSend;

delete buf;

FileClose(srcFileHandle);

SendFile = false;

}

else{

bufSize = SendBlock; //SendBlock = 10M

buf = new char[bufSize];

FileRead(srcFileHandle,buf,bufSize);

do{

Application->ProcessMessages();

byteSend = Socket->SendBuf(buf,bufSize);

}while(byteSend == -1);

byteTotalSend +=byteSend;

delete buf;

SendCount++;

}

}

}

else{

int byteRead;

strData = Socket->ReceiveText();

srcFileHandle = FileOpen(strData,fmOpenRead);

srcFileSize = FileSeek(srcFileHandle,0,2) + 1;

FileSeek(srcFileHandle,0,0); //回到文件起始位置;

strData = IntToStr(srcFileSize);

Socket->SendText(strData);

SendCount = 1;

SendFile = true;

}

}



//接收端

void __fastcall TForm1::sckClientRead(TObject *Sender,

TCustomWinSocket *Socket)

{

if(GetSrcFileSize){

AnsiString strData;

strData = Socket->ReceiveText();

fSize = StrToInt(strData);

desFileHandle = FileCreate("Recieved.zip");

ByteRecievedTotal = 0;

GetSrcFileSize = false;

Socket->SendText("GetFile");

}

else{

char *buf;

int ByteToRecieve, ByteRecieve, ByteRecieved;

ByteRecieved = 0;

ByteToRecieve = Socket->ReceiveLength();

buf = new char[ByteToRecieve];

ByteRecieved = Socket->ReceiveBuf(buf,ByteToRecieve);

FileWrite(desFileHandle,buf,ByteRecieved);

delete buf;

ByteRecievedTotal += ByteRecieved;

Label1->Caption = IntToStr(ByteRecievedTotal);



if (ByteRecievedTotal == fSize){

FileClose(desFileHandle);

MessageBox(Handle,"接收完成","接收文件",MB_OK);

}

}

}
 
可以用发送端用ICS控件里面的ftpsev(ftpserver)

接受端用FTP(delphi自带)
 
对这类大文件最好是用压缩流,分块处理。不仅效率提高,还能支持断点续传。如有兴趣
发EMAIL给我。
 
to j_shen2000:
我查找你的资料不能找到你的Email。如果你有这方面的资料请E给我
我的Email:leebonslee@263.net
 
我已经给你去了MAIL,收到否?
 
用Indy吧。方便得要命。在D6中集成了。
 
啊!已经有人用D6 啦?
 
d6?哪里有下载
 
delphi中有自带例子
 
多人接受答案了。
 
后退
顶部