请问bcb中传文件时,怎么分片传输来传送比较大的文件,?(我现在只能传输<=8k的文件,代码可以直接运行,贴在下面)急需!!!谢谢!
我的程序现在的已达到的功能:服务器可以向客户端传送文件,但是只能传<=8k的文件(这是socket的约定),请 教我如何实现分片传送,来达到可以传送比较大的文件!(最好能详细一些,谢谢!!!(因为怕上传文件可能染上病毒,给大家带来不便,故给出代码,不上传文件)
我的代码如下:(对我的代码有什么好的见解的,可以给我指出来,不胜感激)
服务器:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "fuwuqi.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tclient *client;
//---------------------------------------------------------------------------
__fastcall Tclient::Tclient(TComponent* Owner)
: TForm(Owner)
{ //初始化
receiveMemo->Clear();
ServerSocket1->Port=10000;
ServerSocket1->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall Tclient::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{ //接收客户端发来的信息
receiveMemo->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
void __fastcall Tclient::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{ //状态栏里显示连接上的状态
StatusBar1->Panels->Items[0]->Text=Socket->RemoteAddress+" connect with server...";
}
//---------------------------------------------------------------------------
void __fastcall Tclient::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{ //与客户端连接失败时在状态栏里显示断开状态
StatusBar1->Panels->Items[0]->Text=Socket->RemoteAddress+" disconnect with server";
}
//---------------------------------------------------------------------------
void __fastcall Tclient::sendMemoKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{ //向客户端返回信息
if(Key==VK_RETURN)
ServerSocket1->Socket->Connections[0]->SendText(sendMemo->Text.c_str());
}
//---------------------------------------------------------------------------
void __fastcall Tclient::Button1Click(TObject *Sender)
{
OpenDialog1->Title="源文件";
if( OpenDialog1->Execute() )
Edit1->Text = OpenDialog1->FileName;
int iFromFileHandle, iToFileHandle; // 声明文件对象
int iFileLength; // 文件长度
int iBytesRead, iBytesWritten; // 实际读、写文件的字节数
char *pszBuffer; // 缓冲区
long FILEBUFSIZE=1024*8;
try
{
// 打开源文件
iFromFileHandle = FileOpen(Edit1->Text, fmOpenRead);
// 显示文件大小信息
iFileLength = FileSeek(iFromFileHandle, 0, 2);
Edit2->Text = IntToStr(iFileLength)+"字节";
pszBuffer = new char[FILEBUFSIZE];
FileSeek(iFromFileHandle, 0, 0);//将文件指针移到文件开始处
do
{
iBytesRead = FileRead(iFromFileHandle,pszBuffer,FILEBUFSIZE);
ServerSocket1->Socket->Connections[0]->SendBuf(pszBuffer,iBytesRead);
} while( iBytesRead==FILEBUFSIZE);
ShowMessage("发送文件完毕。");
delete[] pszBuffer;
FileClose(iFromFileHandle); // 关闭源始文件
}
catch(EInOutError &e)
{
Application->MessageBox("运行过程中出错。", "错误", IDOK);
}
}
//---------------------------------------------------------------------------
客户端:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include "server2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tclient *client;
AnsiString strServer;
AnsiString strPort;
//---------------------------------------------------------------------------
__fastcall Tclient::Tclient(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//----------------------------------------------------------
void __fastcall Tclient::openClick(TObject *Sender) //点击"打开"菜单,
{ //弹出对话框
if(InputQuery("select computer tp connect","connect to",strServer))
{
if(!strServer.IsEmpty()) //如果输入不为空
ClientSocket1->Host=strServer;//就把输入的地址作为要连接的服务器地址
else { //若输入为空
ShowMessage("Select computer error!"); //显示出错
return;
}
}
if(InputQuery("select port connect","port connect to",strPort))//弹出框输端口
{
if(!strPort.IsEmpty())
{
ClientSocket1->Port=StrToInt(strPort);//把输入的端口作为要连接的服务器的端口
}
else {
ShowMessage("select port error");//若不输入,则显示出错
return;
}
}
ClientSocket1->Active=true;//打开连接
}
//----------------------------------------------
void __fastcall Tclient::closeClick(TObject *Sender)
{ //点关闭菜单,则关闭连接
if(ClientSocket1->Active)
{
ClientSocket1->Close();
}
}
//****************************************
void __fastcall Tclient::FormCreate(TObject *Sender)
{ //初始化客户端窗口
open->Enabled=true;
close->Enabled=false;
StatusBar1->SimpleText="disconnected";
}
//-------------------------------------------
void __fastcall Tclient::ClientSocket1Connect(TObject *Sender,TCustomWinSocket *Socket)
{
open->Enabled=false;//重置菜单状态
close->Enabled=true;
//状态栏里显示状态
StatusBar1->SimpleText=AnsiString("Connected to server:")+strServer+AnsiString(" port:")+strPort;
}
//-----------------------------------------------
void __fastcall Tclient::ClientSocket1Disconnect(TObject *Sender,TCustomWinSocket *Socket)
{
close->Enabled=false;//重置菜单状态
open->Enabled=true;
//状态栏里显示状态
StatusBar1->SimpleText="disconnected";
}
//----------------------------------------------------
void __fastcall Tclient::sendMemoKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_RETURN)//若按下回车键,则发送
{
if(ClientSocket1->Active)
{//发送文本
ClientSocket1->Socket->SendText(sendMemo->Text);
sendMemo->Clear();
}
}
}
//---------------------------------------------------------------------------
void __fastcall Tclient::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{ //接收文件
long bufsize;
int filehwnd;
char *buf;
bufsize=Socket->ReceiveLength();
buf=(char *)malloc(bufsize);
memset(buf,0x00,bufsize);
Socket->ReceiveBuf(buf,bufsize);
SaveDialog1->Title="另存为";
if(SaveDialog1->Execute())
Edit1->Text = SaveDialog1->FileName;
filehwnd = FileCreate(Edit1->Text); // 打开目标文件
FileSeek(filehwnd,0,2);
FileWrite(filehwnd,buf,bufsize);
FileClose(filehwnd);
free(buf);
}
//---------------------------------------------------------------------------
一来希望把自己的程序与大家分享,二来希望大家帮我完善此程序!