一. 前言
目前网络编程技术有很多,一般都是直接利用编程软件自带的功能函数或控件来完成,用户不必关心低层的操作,确实带来方便。但灵活性不够,如果要传输的文件比较大,则速度慢。如果网络的断线率高,则不得不重新传输。本程序可以克服以上不足,将任意大小的文件视网络状况在客户端分割成任意大小的数据流进行发送,在服务端接收数据流,并组装成原文件。如果网络被中断,则记下位置,待网络恢复后继续从断点的位置传输,终端继续接收,直到传输完毕。
本程序在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
#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://将接收的文件在屏幕上显示。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!