利用VB进行服务器编程实例讲解.docx

上传人:b****4 文档编号:4459756 上传时间:2022-12-01 格式:DOCX 页数:13 大小:23.17KB
下载 相关 举报
利用VB进行服务器编程实例讲解.docx_第1页
第1页 / 共13页
利用VB进行服务器编程实例讲解.docx_第2页
第2页 / 共13页
利用VB进行服务器编程实例讲解.docx_第3页
第3页 / 共13页
利用VB进行服务器编程实例讲解.docx_第4页
第4页 / 共13页
利用VB进行服务器编程实例讲解.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

利用VB进行服务器编程实例讲解.docx

《利用VB进行服务器编程实例讲解.docx》由会员分享,可在线阅读,更多相关《利用VB进行服务器编程实例讲解.docx(13页珍藏版)》请在冰豆网上搜索。

利用VB进行服务器编程实例讲解.docx

利用VB进行服务器编程实例讲解

现在大多数语言都支持客户-服务器模式编程,其中VB给我们提供了很好的客户-服务器编程方式。

下面我们用VB来实现TCP/IP网络编程。

  TCP/IP协议是Internet最重要的协议。

VB提供了WinSock控件,用于在TCP/IP的基础上进行网络通信。

当两个应用程序使用Socket进行网络通信时,其中一个必须创建Socket服务器侦听,而另一个必须创建Socket客户去连接服务器。

这样两个程序就可以进行通信了。

  1.创建服务器,首先创建一个服务端口号。

并开始侦听是否有客户请求连接。

  建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件),添加两文本框Text1,Text2,和一按钮Command1。

  PrivateSubForm_Load()

    SockServer.LocalPort=2000′服务器端口号,最好大于1000

    SockServer.Listen′开始侦听

  EndSub

  PrivateSubForm_Unload(CancelAsInteger)

    SockServer.Close

  EndSub

  PrivateSubSockServer_Close()

    SockServer.Close

  EndSub

  PrivateSubSockServer_ConnectionRequest(ByValrequestIDAsLong)

    SockServer.Close

    SockServer.AcceptrequestID′表示客户请求连接的ID号

  EndSub

  ′当客户向服务器发送数据到达后,产生DataArrival事件,在事件中接收数据,GetData方法接收数据。

  PrivateSubSockServer_Data

    Arrival(ByValbytesTotalAsLong)

    DimsAsString

    SockServer.GetDatas

    Text1.Text=s

  EndSub

  当我需要向客户发送数据时,只需调用SendData方法。

  PrivateSubCommand1_Click()

    SockServer.SendDataText2.Text

  EndSub

  2.创建客户。

要创建客户连接服务器,首先设置服务器主机名,如IP地址、域名或计算机名,然后设置服务器端口,最后连接服务器。

  建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件),取名为:

SockC1。

添加两文本框Text1,Text2,和一按钮Command1。

  PrivateSubForm_Load()

    SockCl.RemoteHost=′127.0.0.1″

    ′表示服务器主机名

    SockCl.RemotePort=2000

   ′表示服务器端口名

    SockCl.Connect

   ′连接到服务器

EndSub

  PrivateSubForm_Unload(CancelAsInteger)

    SockCl.Close

  EndSub

  PrivateSubSockCl_Close()

    SockCl.Close

  EndSub

  PrivateSubSockCl_DataArrival(ByValbytesTotalAsLong)

    DimsAsString

    SockCl.GetDatas′接收数据到文本框中

    Text1.Text=s

  EndSub

  PrivateSubCommand1_Click()

    SockCl.SendDataText2.Text′向服务器发送数据

  EndSub

  3.进行通信。

把这两个窗体分别编译成两个EXE文件,服务器Server.exe和客户Client.exe程序,并把它们分别安装在服务器端和客户端,这样就可以实现两者通信了。

VBSocket编程(Winsock控件创建TCP/IP客户机/服务器程序)

Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。

即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。

下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。

下面是Winsock控件的相关属性,方法和事件。

(略去一些暂用不到的)

*属性

-------------------------------------------------------------------------

LocalHostName|本地机器名

LocalIP|本地机器IP地址

LocalPort|本地机器通信程序的端口(0<端口<65536)

RemoteHost|远程机器名

RemotePort|远程机器的通信程序端口

state|连接的当前状态(文后有详细说明)

Protocal|使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)

--------------------------------------------------------------------------

*方法

--------------------------------------------------------------------------

Listen

Listen方法用于服务器程序,等待客户访问。

格式:

Winsock对象.listen

Connect

Connect方法用于向远程主机发出连接请求

格式:

Winsock对象.connect[远程主机IP,远程端口]

Accept

Accept方法用于接受一个连接请求

格式:

Winsock对象.acceptRequestID

Senddata

此方法用于发送数据

格式:

Winsock对象.senddata数据

Getdata

用来取得接收到的数据

格式:

Winsock对象.getdata变量[,数据类型[,最大长度]]

Close

关闭当前连接

格式:

Winsock对象.close

*事件

----------------------------------------------------------------------------

Close|远程机器关闭连接时触发

Connect|连接建立好,可以进行通信时触发(客户端)

ConnectRequest|有请求连接到达时产生(服务器端)

DataArrival|有数据到达时触发

Error|发生错误时发生

SendProgress|数据传送进度

-----------------------------------------------------------------------------

服务器程序的实现过程是:

(1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过的值即可)。

(2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。

(3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。

(4)服务器程序用Accept方法接受客户机程序的requestID请求。

这样,服务器程序就可以用SendData方法发送数据了。

Accept方法必须用上一步得到的requestID作为其参数。

(5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。

在该事件中,可以用GetData方法接收数据。

(6)如果接受到Close事件,则用Close方法关闭TCP/IP连接。

客户机程序的实现过程是:

(1)客户程序设置Remotehost属性,以便指定运行服务器程序的主机名,该字符串可在“控制面板|网络|标识|计算机名”中查到。

(2)设置RemotePort属性,以便指定服务器程序的侦听端口。

(3)使用Connect方法,向服务器提出连接请求。

(4)服务器接受客户机程序的请求,客户机程序产生Connect事件,就可以用SendData方法发送数据了。

(5)当客户机程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。

在该事件中,可以用GetData方法接收数据。

(6)如果接受到Close事件,则用Close方法关闭连接。

Winsock控件还有两个重要的属性,即Protocol和State。

Protocol设定使用的协议是TCP还是UDP:

取值sckTCPProtocol表示TCP,取值sckUDPProtocol则表示UDP。

因为Winsock控件的缺省设置是sckTCPProtocol,所以程序中并没有使用Protocol属性。

State属性反映的是当前TCP/IP的连接状态,取值如表1所示。

表1Winsock控件的State属性及其描述

常数值描述

SckClosed0缺省值,关闭

SckOpen1打开

SckListening2侦听

SckConnectionPending3连接挂起

SckResolvingHost4识别主机

SckHostResolved5已识别主机

SckConnecting6正在连接

SckConnected7已连接

SckClosing8同级人员正在关闭连接

SckError9错误

先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。

再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。

如果连接成功,则服务器和客户机程序窗口都会出现两个文本框。

这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。

服务器程序使用的控件如下:

(1)Command1:

退出按钮;

(2)textsend:

发送数据文本框;

(3)Winsockserver:

服务器Winsock;

(4)textget:

接收数据文本框。

服务器程序的界面如图所示。

服务器程序的源代码如下:

PrivateSubCommand1_Click()

End

EndSub

PrivateSubForm_Load()

textsend.Visible=False

textget.Visible=False

Winsockserver.LocalPort=1001

Winsockserver.Listen

EndSub

PrivateSubtextsend_Change()

Winsockserver.SendDatatextsend.Text

EndSub

PrivateSubWinsockserver_Close()

Winsockserver.Close

End

EndSub

PrivateSubWinsockserver_ConnectionRequest(ByValrequestIDAsLong)

textsend.Visible=True

textget.Visible=True

IfWinsockserver.State<>sckClosedThenWinsockserver.Close

Winsockserver.AcceptrequestID

EndSub

PrivateSubWinsockserver_DataArrival(ByValbytesTotalAsLong)

DimtmpstrAsString

Winsockserver.GetDatatmpstr

textget.Text=tmpstr

EndSub

客户机程序使用的控件如下:

(1)Command1:

退出按钮;

(2)Command2:

连接按钮;

(3)Winsockclient:

客户Winsock;

(4)Text1:

主机名文本框;

(5)Textsend:

发送数据文本框;

(6)Textget:

接收数据文本框;  

客户机程序的源代码如下:

PrivateSubCommand1_Click()

End

EndSub

PrivateSubCommand2_Click()

Winsockclient.Connect

EndSub

PrivateSubForm_Load()

textsend.Visible=False

textget.Visible=False

Winsockclient.RemotePort=1001

Winsockclient.RemoteHost="sccdsz"

EndSub

PrivateSubText1_Change()

Winsockclient.RemoteHost=Text1.Text

EndSub

PrivateSubtextsend_Change()

Winsockclient.SendDatatextsend.Text

EndSub

PrivateSubWinsockclient_Close()

Winsockclient.Close

End

EndSub

PrivateSubwinsockclient_Connect()

textsend.Visible=True

textget.Visible=True

Command2.Visible=False

EndSub

PrivateSubwinsockclient_DataArrival(ByValbytesTotalAsLong)

DimtmpstrAsString

Winsockclient.GetDatatmpstr

textget.Text=tmpstr

EndSub

 

1引言

   随着网络通信的兴起与迅速发展,TCP/IP协议已成为计算机网络中最主要的传输协议,TCP/IP传输协议也越来越为人所熟知。

目前的Internet网就是基于TCP/IP协议的互联网络。

TCP/IP除了用于广域外,在局域网中也广泛应用。

   TCP是传输控制协议,它提供了一种可靠的、面向会话连接的数据流服务,它可以在一个分组可能发生丢失、破坏、重复、延迟和乱序的不可靠物理网络之上通过确认、流控、复用同步等自动纠错技术提供一种可靠的进程间通信机制,从而充分保证用户数据传送的可靠和有序性。

使用TCP协议通信时,TCP建立并控制数据发送方与接收方的会话关系,当接收方正确收到数据后,必须向发送方发送确认信息。

如果发送方在指定时间内未能收到确认信息,将重发数据包。

   IP指分组交换协议,是联网的主机之间定义数据包传送路由的规则,它的基本任务是通过网络传送数据报,各个IP数据报之间是相互独立的。

IP本身没有连接协议,在交换数据前不会建立会话关系。

IP收到数据后也不确认,发送方和接收方都不检测数据传输的正确性。

所以仅有IP是不可靠的,不能确保正确传输数据。

TCP与IP的组合则构成了功能完整的传输协议。

   在TCP/IP网络应用中,多数网络应用程序是使用客户/服务器模型方式,客户向服务器发出服务请求,服务器作出应答响应,服务器通常在一个众所周知的地址侦听客户向服务器发出的请求,服务进程这时一直是处于休眠状态,直到有一个客户程序提出连接请求。

服务器作出应答,并为客户提供相应的服务。

客户/服务器模型最重要的特点是非对等相互作用,客户与服务器处于不平等的地位。

服务器拥有客户机所不具备的各种软硬件资源和运算处理能力,服务器提供服务,客户请求服务,这种模式适应了网络资源、运算能力、信息分布不均等现象,成为IP应用的主要模式。

Internet中的WWW、FTP、Telnet、E-mail等许多典型应用都是采用客户/服务器模型方式。

   VisualBasic是Windows环境下简单、易学、高效的可视化编程语言开发系统,以其所见即所得的可视化界面设计风格和32位面向对象的程序设计等特点,已广泛地应用于各个领域,是很多计算机软件开发人员采用的开发工具。

VB不但提供了良好的界面设计能力,而且在网络通信方面的功能也很强。

采用VB开发网络通信应用软件十分方便,尤其软件界面设计非常便捷,编程工作量较小,开发周期短。

   VisualBasic6.0中提供了Winsock控件,用于支持网络中两台以上计算机之间进行通信。

Winsock控件提供了多样化的属性和方法来实现网络通信。

通过设置Winsock控件属性及调用控件方法就能够实现TCP或UDP方式的网络通信。

因此,使用Winsock控件编写网络通信程序的过程,实际上就是设置Winsock控件属性和调用控件方法的过程。

利用这个控件,编程人员可以轻松地编写出TCP/IP客户服务器程序。

 

   2Winsock控件

   Winsock控件是不可视控件,它提供了访问TCP和UDP网络服务非常简便的途径,使编程人员开发客户/服务器应用程序时,不必了解TCP的细节或调用低级的WinsockAPIs函数,只通过设置Winsock控件的属性并调用其方法,就可直接连接到一台远程计算机进行,并可实现双向数据交换。

MicrosoftAccess、VisualBaisc、VisualC++或VisualFoxPro都可用其编写客户服务器程序。

   如果访问TCP传输控制协议服务功能,则须建立连接并实现主机间点对点通信。

如果访问UDP数据文报协议功能,则不建立连接,发送数据将以广播方式上网传输。

 

   3TCP/IP客户服务器程序设计方法

   使用TCP/IP协议通讯,首先要指定通信方式为TCP方式,将Winsock控件的Protocol属性设置为sckTCPProtocol.然后,按TCP通信协议规定,先要申请建立网络连接,然后才能传输数据。

   3.1服务器程序开始侦听网络

   服务器程序窗体中有三个Winsock控件,Name分别为sckServer、sckBusy和sckListen.

   其中sckListen是侦听控件;sckBusy是;sckServer连接控件。

侦听控件和连接控件不能是同一个Winsock控件。

   服务器程序必须首先侦听网络,等待客户的连接申请,才有可能建立网络连接。

服务器程序开始侦听网络前,需要为侦听用(sckListen)控件的LocalPort属性设置通信接口,然后调用Listen方法。

服务器程序开始侦听网络的程序代码如下:

   

sckListen.LocalPort=4477sckListen.Listen'侦听网络

 

   3.2客户程序申请连接

   当服务器程序已经启动运行并开始侦听网络后,在客户程序申请连接前,需要为客户Winsock控件的RemodeHost属性设置远程主机,为RemodePort属性设置通信接口,然后再调用Connect方法向服务器程序申请连接。

   设置远程主机名,可以是计算机名也可是IP地址。

如果是主机计算机名,则需要系统翻译为相应的IP地址;如果是主机IP地址,则直接进行连接。

   申请连接的程序代码如下:

 

sckClient.Protocol=sckTCPProtocol'设置协议为TCP方式

'IP地址"127.0.0.1"代表本机,与本机的实际地址无关

sckClient.RemoteHost="127.0.0.1""129.200.0.1"

'设置远程主机接口号,该值必须与设置远程主机服务器程序的接口号一致

sckClient.RemotePort=4477

sckClient.Connect'申请连接

 

   3.3服务器程序应答连接请求

   服务器程序启动侦听网络后,当客户程序执行Connect方法申请连接时,服务器程序的侦听控件(sckListen)触发ConnectionRequest事件,并传递连接请求句柄。

编程人员需要在该当事件程序中调用连接控件(sckServer)的Accept方法实现连接。

   服务器程序应答连接的程序代码如下:

 

PrivateSubsckListen_ConnectionRequest(ByValrequestIDAsLong)

sckServer.AcceptrequestID'应答连接请求

EndSub

 

   当服务器程序执行Accept方法建立连接后,客户程序中的接连控件将触发Connect事件通报连接完成,否则触发Error事件通报连接失败。

可以在该事件程序中加入连接后的处理程序。

   如果要求服务器程序支持多用户连接,则需要创建Winsock控件数组,在连接时动态生成Winsock控件与客户程序建立连接。

程序代码应修改如下:

 

PrivateSubsckListen_ConnectionRequest(ByValrequestIDAsLong)

DimiAsLong

IfCurNumber

Fori=1ToCurNumber

IfsckServer(i).State=0Then'判断是否有空闲Winsock控件

ExitFor

EndIf

Nexti

Ifi=CurNumberThen

CurNumber=CurNumber+1

i=CurNumber

EndIf

LoadsckServer(i)'动态加载Winsock控件

sckServer(i).AcceptrequestID

ExitSub

EndIf

sckBusy.Close

sckBusy.AcceptrequestID

EndSub

 

   3.4传送数据

   当服务器程序和客户程序连接成功后,可以开始传送数据。

建立连接后的服务器程序和客户程序都可以发送或接收数据。

当一方要发送数据时,调用SendData方法。

DimSendStrAsString

SendStr="连接成功!

"

Winsock1.SendDataSendStr'传送数据

   如果一方发送了数据,在连接的另一方控件将产生DataArrival事件,在DataArr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1