• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
C++
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
C++ Builder文件任意分割传输技术
软件发布 C++ Builder文件任意分割传输技术
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 编程技术 | BCB教程 | C++ Builder文件任意分割传输技术

C++ Builder文件任意分割传输技术

 

添加时间: 2007-7-9 4:21:57  作者: BCB教程  阅读次数:96   来源: http://www.d9soft.com

 

 

       

  [摘要] 本文详细介绍了应用C++builder把文件任意分割成若干个小块在网络上发送并在终端上接收,重新组装成原文件的技术。

  一. 前言

  目前网络编程技术有很多,一般都是直接利用编程软件自带的功能函数或控件来完成,用户不必关心低层的操作,确实带来方便。但灵活性不够,如果要传输的文件比较大,则速度慢。如果网络的断线率高,则不得不重新传输。本程序可以克服以上不足,将任意大小的文件视网络状况在客户端分割成任意大小的数据流进行发送,在服务端接收数据流,并组装成原文件。如果网络被中断,则记下位置,待网络恢复后继续从断点的位置传输,终端继续接收,直到传输完毕。

  本程序在Windows2000调试通过,读者可以应用本程序的设计技术应用到其他网络通讯中去。

  二.建立程序框架

  新建一个工程存为tongxun.bpr,Form文件存为shi.cpp,对Form的属性做如下修改:BorderStyle设为bsSingle,Name设为Form,Position设为PoScreenCenter。在Form上放置2个Tbutton组件,分别为:Name分别为Button1和Button2,Caption分别为"发送图片"和"选择图片文件",放置1个Timage组件,Name为Image1,放置1个Opendialog,Name为name,用于打开1个文件,最后放置1个TserverSocket和1个Tclientsocket,Name属性分别为server和client。

  这样就完成了程序框架的建立,如图示:

 

  三.程序实现

  本程序是在客户端发送一个2M字节的BMP图片,终端接收和组装此图片并显示在Form的窗口中用于验证。本程序即可作为发送端,也可做接收端,只要在两台互联的计算机上运行即可。

  shi.cpp源文件如下:

#include <VCL.H>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
static int shi=0,emod=0,hui=0,x=0,a=0,i=0;
AnsiString filename;
file://---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
file://---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ client->Active=false;
 client->Port=8888;
 client->Active=true;} file://联接远程计算机
 file://---------------------------------------------------------------------------
 void __fastcall TForm1::clientConnect(TObject *Sender,TCustomWinSocket *Socket)
 { label->Caption="ok";} file://联接成功的提示。
  file://下面的函数用于接收数据和组装数据并显示。
  void __fastcall TForm1::serverClientRead(TObject *Sender,
  TCustomWinSocket *Socket)
  { // static long a=0;
   static TMemoryStream* pms = new TMemoryStream();
   void *z[20000]; file://定义缓冲区大小
   if(shi!=1)
   {Socket->ReceiveBuf(z,20000); file://接收SOCKET中的数据流
    pms->Position=a;
    pms->WriteBuffer(z,20000); file://写入缓冲区
    a=a+20000; file://改变内存流指针
    client->Active=false; file://每次发送前要判断网络是否畅通
    client->Port=8888; file://联接远程计算机,如果成功则
    client->Active=true;} file://发送,否则等待。
   Else file://接收最后emod个字节。
   {pms->WriteBuffer(z,emod);
    pms->SaveToFile("d:\\k.bmp");
    label->Caption="successful";
    pms->Position=0;
    Image1->Picture->Bitmap->LoadFromStream(pms);}
  } file://将接收的文件在屏幕上显示。


(图2)发送前
 
(图3)接收后显示 


  file://以下函数用于任意分割文件和发送文件。
  void __fastcall TForm1::clientWrite(TObject *Sender,TCustomWinSocket *Socket)
  { void *p[20000];
   static long k=20000;//x=0;//hui=0;
   static long bmpsize,/*i=0*/c,mod;
   static TMemoryStream* pms = new TMemoryStream();
   if(hui==0){pms->LoadFromFile(filename);hui++;}//装入要发送的文件。
    bmpsize=pms->Size; file://计算文件的大小(字节)
    c=(int)bmpsize/k; file://分割文件为c
    mod=bmpsize%k; file://分割后于下的字节数
    emod=mod; file://使mod在整个程序都可访问
    if(i      {pms->Position=x; file://改变内存流读取指针
     pms->ReadBuffer(p,k); file://把内存流读入缓冲区,即改变流的类型
     x=x+k;
     client->Socket->SendBuf(p,k); file://将分割的文件发送
     i++; }
    else
    { shi++;
     if(shi==1)
      {pms->ReadBuffer(p,mod); file://发送最后mod个字节后,发送完毕
       client->Socket->SendBuf(p,mod); }}}


//下面函数用于选择要发送的文件(*.bmp)
void __fastcall TForm1::Button2Click(TObject *Sender)
{ if(OpenDialog1->Execute()){
  filename = OpenDialog1->FileName;
  label->Caption="选择图片成功";
  hui=0; shi=0; a=0;
  x=0; i=0;}}
file://---------------------------------------------------------------------------
 

  由于在文件中要用到全局变量gan,所以要在unit.h的头文件中加入其定义,如下:

class TForm1 : public TForm
{private: …
TMemoryStream* gan;
…};

  四.技术关键

  把文件进行分割成一块一块的内存流,由于c++builder的套接字Socket在发送接收时是以缓冲区类型的为数据,因此需要把内存流转化成此类型数据传输。为了使在网络断线时保存断点,用了全局变量和函数内部的静态变量巧妙的解决了这个问题。

 

 

 

上下文章:

 

上一篇文章: C++Builder中集合的处理 下一篇文章: 让应用程序禁止Windows屏幕保护

相关文章:

  • 卑鄙病毒:加密你的文件勒索你的钱
  • 端午节忠告:要警惕FLASH祝福文件里的包藏祸心
  • Oracle联机日志文件丢失处理方法
  • servlet实现oracle中读出文件并显示
  • ORACLE控制文件的重建

相关软件:

  • 木马文件粉碎机 V3.0
  • 超级秘密文件夹 5.81
  • PE文件加区器 1.0
  • 文件备份专家 V2.55
  • 文件夹看门狗 V3.5 白金版
  • 文件批量更名大师 V3.26

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • 如何在C++ Builder环境中实现在菜...
  • Windows下DLL编程技术及应用
  • 在BCB中使用DirectX
  • 用C++Builder开发动画DLL
  • 用C++Builder建立多线程COM服务器
  • C++Builder定制系统菜单
  • ODBC中的同步与异步执行模式
  • C++ Builder下数据库报表Master/D...
  • BCB环境下CORBA实做之客户端
  • 在C++Builer中多线程的实现

BCB教程阅读排行

  • C++ Builder 初学问与答(一)
  • 在 C++ Builder中利用串行通信控件...
  • C++ Builder 初学问与答(二)
  • 漫谈C++ Builder多线程编程技术
  • C++ Builder 初学问与答(十六)
  • C++ Builder 初学问与答(八)
  • 在C++ Builder中用Ole控制Excel表
  • C++ Builder 初学问与答(六)
  • C++ Builder 初学问与答(四)
  • C++ Builder 初学问与答(七)

编程技术阅读总排行

  • VB入门教程之一
  • 第二章 PowerBuilder 入门之创建新...
  • Java连接数据库实例
  • 第一章 什么是PowerBuilder
  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有