如何通过TCP/ip传送大文件?(200分)

  • 主题发起人 主题发起人 lufang
  • 开始时间 开始时间
L

lufang

Unregistered / Unconfirmed
GUEST, unregistred user!
如果用socket.sendstream(文件流)方式发送的话在,发送大文件时,因为要将文件全部
读入流中,经常不能发送成功,请问有无更好的方法和控件。我这人比较懒,不想一点
一点读入buffer中。
 
用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);

}

}

}
 
只能一点一点读再发,你把这一点一点的读写得大一点就可以了,不要太懒嘛。
如果文件需要关闭的话,用一个全局变量记住上次发送的文件的字节位,下次再Seek。
 
楼上那位说的是端点续传的问题,程序员不能太懒
 
对啊,只能一段一段地收发。
 
>>发送大文件时,因为要将文件全部读入流中,经常不能发送成功
采用阻塞方式就不会有这个问题了!
 
如果不是那样,我倒也非常感兴趣
 
lufang:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明 http://www.delphibbs.com/delphibbs/rules.htm
 
分割文件,多线程传输!!
对否??
 
没得懒的,sendbuffer最好了,一个大文件怎么样sendstream,不可能的
 
接受答案了.
 
后退
顶部