敬业的IT人 >> 编程开发 >> C++Builder >> 客户机/服务器中数据流的接收和发送(上)

客户机/服务器中数据流的接收和发送(上)

敬业的IT人 互联网 佚名 2008-1-3 21:45:03
    ·WEB专用服务器的安全设置的实战技巧
    ·巧用花生壳玩转个人服务器
    ·实战:用宽带架设个人服务器
    ·用Helix Server组建视频服务器
    ·Win服务器入门--IIS安装与配置(组图)
    ·架设语聊服务器 打造自己的TS聊天平台
    ·配置 DNS 服务器
    ·Vagaa与VeryCD目前在服务器上的行为比
    ·MSS系统:基于服务器的网吧双线路接入
    ·DNS全攻略之二 安装与管理DNS服务器


  在 C/S(客户机和服务机)中进行大量数据的发送,如文件的发送等,利用C++Builder5.0 控件来完成是非常有用的。在C++Builder 5.0中NMStrmServ控件可以在服务器监听6771(这是一个缺省的端口)端口上的消息,而NMStrm控件是一个基于TCP/IP的流控件。它可以接收数据流。然后通过网络将其发送给服务器。数据流的发送和消息的发送十分的相同。下面我们来设计一个客户机与服务机的数据流的发送实例。


  现在,首先打开C++Builder 5.0 新建一个工程,在Form中添加一个NMStrm控件,一个NMStrmServ控件,一个OpenDialog控件,二个Button控件,二个Edit控件,二个Label控件,一个RichEdit控件,一个StatusBar控件。

  一.各控件的属性

各控件属性设计如下表:

控件名属性属性值NMStrmName,PortNMStrm1,6771NMStrmServName,PortNMStrmServ1,6771OpenDialogNameOpenDialog1ButtonName,CaptionButOpen,装入文件ButtonName,CaptionButSend,发送EditNameHostEditNameLoadFileLabelName,CaptionLabel1,主机名LabelName,CaptionLabel2,选择的文件RichEditNameRichEdit1StatusBarNameStatusBar1
  因为程序的需要,必须在Unit1.h中的类class TForm1 : public TForm 中的private部分加入如下的声明:

private: //user declarations
bool ValidFile;

  这个bool 变量用于判断文件的有效性。

  二.控件的事件和方法


  1.NMStrm的事件和方法:

PostIt方法:该方 糜诮萘鞣⑺透衿鳌F涓袷饺缦拢?br>
  function PostIt(const sStrm: TStream): string;

OnConnect事件:在PostIt方法发出和服务器建立连接以后,将产生且事件。

OnHostResolved事件:如果成功地将主机名或域名地址解析成IP地址后,将产生且事件 。

OnMessageSent事件:在数据流发送成功后,产生的事件。

OnInvalidHost事件:过程主机输入不正确或找不到主机名产生的事件。

OnPacketSent事件:在数据流发送过程中用于显示发送进度的事件,属性BytesSent和BytesTotal是显示发送的进度。

  2.NMStrmServ的事件和方法:

OnNSG事件:用于对客户机发送过来的数据流准备数据缓冲区空间。并根据获取数据流的大小分配相应的内存空间来保证缓冲区的大小,再把数据流显示在RichEdit控件中,最后删除缓冲区。
  三. 程序源代码如下:

//---------------------------------------------------------------------------
//"Unit1.h"的源代码
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include $#@60;Classes.hpp$#@62;
#include $#@60;Controls.hpp$#@62;
#include $#@60;StdCtrls.hpp$#@62;
#include $#@60;Forms.hpp$#@62;
#include $#@60;Dialogs.hpp$#@62;
#include $#@60;NMMSG.hpp$#@62;
#include $#@60;NMSTRM.hpp$#@62;
#include $#@60;Psock.hpp$#@62;
#include $#@60;ComCtrls.hpp$#@62;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TNMStrmServ *NMStrmServ1;
TOpenDialog *OpenDialog1;
TNMStrm *NMStrm1;
TLabel *Label1;
TEdit *Host;
TButton *ButOpen;
TButton *ButSend;
TStatusBar *StatusBar1;
TEdit *LoadFile;
TLabel *Label2;
TRichEdit *RichEdit1;
void __fastcall ButOpenClick(TObject *Sender);
void __fastcall ButSendClick(TObject *Sender);
void __fastcall NMStrmServ1MSG(TComponent *Sender,
const AnsiString sFrom, TStream *strm);
void __fastcall NMStrm1Connect(TObject *Sender);
void __fastcall NMStrm1HostResolved(TComponent *Sender);
void __fastcall NMStrm1MessageSent(TObject *Sender);
void __fastcall NMStrm1InvalidHost(bool &Handled);
void __fastcall NMStrm1PacketSent(TObject *Sender);
private: // User declarations
bool ValidFile;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com