请教用c++Builder实现文件自动传输(响应请求后)

totaljuven 2007-04-26 09:13:26
在下是新手,水平仅限于实现文本文档之类的传输问题.无奈这次毕设的题目就是实现一个服务器的开发.大概的功能就是从本地文件中选一些文件然后在客户提出连接请求后自动发送至目的地.
我这几天一直在找资料,今天试着编了一个程序能手动地进行指定地址的文件传输,使用NMStrmServ和NMStrm组件实现的,但根据要求是响应监听端口然后自动进行传输的,我知道这要用到ClientSocket和ServerSocket组件,麻烦的就是这方面知识我也是临时抱佛脚,恳请这方面的高手能给个代码,能实现最基本的功能:服务器端只要指定一个能打开文件的按钮,客户端有两个EDIT窗口用于指定主机IP与端口号,在加一个连接按钮即可.
又:在下在论坛中得知对于较大的文件最好用Indy实现,这方面的高手也请赐教
小弟是新手,全部家底只有100分,这次贡献99分虽不丰厚但已是尽力而为,但求一片诚心,请笑纳
...全文
743 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hold_zhang 2012-08-16
  • 打赏
  • 举报
回复
顺带学习一下下
Leighf 2007-06-06
  • 打赏
  • 举报
回复
mark
meikeer 2007-05-02
  • 打赏
  • 举报
回复
1、http://topic.csdn.net/t/20030409/08/1636405.html
NO Address specified应该是你机器有问题,请看上面的贴子,我在机器上(winxp,win98,winxp)测试没有问题

2、非常感谢!
totaljuven 2007-05-02
  • 打赏
  • 举报
回复
socket的实现我设了IP地址后,一点button1还是跳出"NO Address specified"的错误窗口
不知meikeer(美可儿) 你的 IP地址是怎么设定的??
感谢meikeer(美可儿)的回复,请接受你应得的99分
totaljuven 2007-04-30
  • 打赏
  • 举报
回复
文件肯定没问题的,我换了好几个文件都出现了同样的错误!!
测试时对文件大小有没有要求??
meikeer 2007-04-30
  • 打赏
  • 举报
回复
没有要求,UDP那个我以前测试时有错误,但忘了怎么解决的了。。。用tcp的吧
meikeer 2007-04-29
  • 打赏
  • 举报
回复
TCP的那个肯定没有问题
meikeer 2007-04-29
  • 打赏
  • 举报
回复
IP地址可以在控件中设置好,代码只是贴了最关键的部份,不过已经很全了,这两个例子是我测试通过的。

"can't open file F:\新建文件夹\表格.doc"????你的文件是不是在打开状态?存在锁定吧?例子是我测试通过的,才敢贴上来
totaljuven 2007-04-28
  • 打赏
  • 举报
回复
meikeer(美可儿)给出的 socket实现部分好象缺少IP地址定位的部分???
totaljuven 2007-04-28
  • 打赏
  • 举报
回复
meikeer(美可儿)给出的nmudp实现运行后有点问题:
运行出界面后,我IP地址输的是10.10.228.38(舍友的IP),端口是2207,文件路径是F:\新建文件夹\表格.doc,但是按下发送按钮后老是跳出一个窗口"can't open file F:\新建文件夹\表格.doc"????我保证这个文件绝对是存在的,这到底是什么问题,不知道meikeer(美可儿)在运行时有没有遇到这个问题!!!!!!!!!
meikeer 2007-04-27
  • 打赏
  • 举报
回复
socket的

此程序服务和客户在一个单元里,即可以作服务端又可以客户端
单元头文件
//---------------------------------------------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
#define FILEDATAMAXSIZE 2048//文件包的传输长度
typedef struct TFileData//发布包的长度
{
int nPosition;//当前传输的次数
short wLength;//当前传输的长度
    int width;//文件的实际长度
CHAR FileData[FILEDATAMAXSIZE];//文件包
}TFileData;


class TForm1 : public TForm
{
__published: // IDE-managed Components
TClientSocket *ClientSocket1;
TServerSocket *ServerSocket1;
TButton *Button1;
TButton *Button2;
TProgressBar *ProgressBar1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
int filewidth;//服务器端文件长度通用变量
   int fssl;//实际的发送数量
int myfilewidth;//客户器端文件长度通用变量
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
单元文件
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClientSocket1->Active = true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Socket->SendText("1");//告诉服务端现在开始准备传输
}
//服务端发送文件---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString str;
str = Socket->ReceiveText();
if (str=="1")
{
TFileData dp;
int hFile;
if (FileExists("D:\\新建文件夹 (2)\\字段注释.xls"))
{
hFile = FileOpen("D:\\新建文件夹 (2)\\字段注释.xls", fmOpenRead | fmShareCompat | fmShareDenyNone);
if (hFile > 0) //打开文件成功
{
dp.width = FileSeek(hFile,0,2);//获取文件的实际长度
filewidth = dp.width;//赋值服务器端文件长度通用变量
dp.nPosition = 0;
fssl = 0;
FileSeek(hFile,0,0);//查找文件的读取点
dp.wLength = FileRead(hFile, dp.FileData, FILEDATAMAXSIZE);//按照文件包的长度从文件的读取点读取文件

FileClose(hFile);
}

}

Socket->SendBuf(&dp, sizeof(dp));//发送文件包
ProgressBar1->Max = filewidth;//赋值进度条的长度
}
if (str=="ok")
{
TFileData dp;
int hFile;
if (FileExists("D:\\新建文件夹 (2)\\字段注释.xls"))
{
hFile = FileOpen("D:\\新建文件夹 (2)\\字段注释.xls", fmOpenRead | fmShareCompat | fmShareDenyNone);
if (hFile > 0) //打开文件成功
{
fssl = fssl +1;
if (filewidth-fssl*FILEDATAMAXSIZE>=FILEDATAMAXSIZE)//判断包的大小
{
dp.width = filewidth;
dp.nPosition = fssl;
FileSeek(hFile,fssl*FILEDATAMAXSIZE,0);
dp.wLength = FileRead(hFile, dp.FileData, FILEDATAMAXSIZE);
// FileSeek(hFile, 0, 0);

FileClose(hFile);
} else
{
dp.width = filewidth;
dp.nPosition = fssl;
FileSeek(hFile,fssl*FILEDATAMAXSIZE,0);
dp.wLength = FileRead(hFile, dp.FileData, filewidth-fssl*FILEDATAMAXSIZE);
// FileSeek(hFile, 0, 0);

FileClose(hFile);
}

}
}
Socket->SendBuf(&dp, sizeof(dp));

}
}
//客户端接收---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
int nSize = Socket->ReceiveLength();
int hFile,mylength;

TFileData dp1;
Socket->ReceiveBuf(&dp1, nSize);
/* BYTE buf[sizeof(FileData)];
TVariant data;
data.pcVal = buf;*/
if (!FileExists("E:\\字段注释.xls"))
{
myfilewidth = dp1.width;
hFile = FileCreate("E:\\字段注释.xls");
FileWrite(hFile,dp1.FileData,FILEDATAMAXSIZE);
FileClose(hFile);
Socket->SendText("ok");
ProgressBar1->Position = FILEDATAMAXSIZE;

} else
{
hFile = FileOpen("E:\\字段注释.xls",fmOpenWrite);
FileSeek(hFile,FILEDATAMAXSIZE*dp1.nPosition,0);
FileWrite(hFile,dp1.FileData,dp1.wLength);
mylength = FileSeek(hFile,0,2);
FileClose(hFile);
if (myfilewidth==mylength)
{
Socket->SendText("over");
ShowMessage("ook");
}
else
Socket->SendText("ok");
ProgressBar1->Position = mylength;

}

}
meikeer 2007-04-27
  • 打赏
  • 举报
回复
nmudp的

//Unit.h---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Dialogs.hpp>
#include <NMUDP.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:// IDE-managed Components
TButton *Button1;
TEdit *Edit1;
TEdit *Edit2;
TStatusBar *StatusBar1;
TMemo *Memo1;
TEdit *Edit3;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TButton *Button2;
TNMUDP *NMUDP1;
TOpenDialog *OpenDialog1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port);
void __fastcall NMUDP1DataSend(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private:// User declarations
public:// User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
Edit3->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(Edit3->Text=="")
{
ShowMessage("请选择一个您要传送的文件.");
return;
}
NMUDP1->RemoteHost=Edit1->Text;
NMUDP1->RemotePort=StrToInt(Edit2->Text);
NMUDP1->ReportLevel=Nmudp::Status_Basic;
const int ThreshHold=2048;
//载入文件流
TFileStream *Strm=new TFileStream(Edit3->Text, fmOpenRead);
char *Buffer=new char[ThreshHold];
int BuffSize=Strm->Size;
int Buffers=BuffSize/ThreshHold;
for(int i=0;i<=Buffers;i++)
{
if(BuffSize>2048)
{
Strm->Read(Buffer,ThreshHold);
NMUDP1->SendBuffer(Buffer,ThreshHold,ThreshHold);
}
else
{
Strm->Read(Buffer,BuffSize);
NMUDP1->SendBuffer(Buffer,BuffSize,BuffSize);
}
BuffSize-=ThreshHold;
}
delete Buffer;
delete Strm;
Memo1->Lines->Add("");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
char *TmpBuffer=new char[NumberBytes+1];
int i;
//读取接收到的文件流
NMUDP1->ReadBuffer(TmpBuffer,NumberBytes,i);
TmpBuffer[NumberBytes]='\0';
Memo1->Text=Memo1->Text+TmpBuffer;
delete[] TmpBuffer;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::NMUDP1DataSend(TObject *Sender)
{
StatusBar1->Panels->Items[0]->Text="文件传送完毕.";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

}
//---------------------------------------------------------------------------
请作参考.以上BCB6.0编译通过.
我不懂电脑 2007-04-27
  • 打赏
  • 举报
回复
《C++ Builder 开发人员指南》
huzhangyou 2007-04-26
  • 打赏
  • 举报
回复
去我的博客吧
有你需要的源代码
http://www.libing.net.cn

传输的方法很多
具体看你的需要了
1:直接Socket
2:Indy
3:ACE
totaljuven 2007-04-26
  • 打赏
  • 举报
回复
小弟的邮箱brbzhang@126.com

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧