利用VB进行服务器编程实例_第1页
利用VB进行服务器编程实例_第2页
利用VB进行服务器编程实例_第3页
利用VB进行服务器编程实例_第4页
利用VB进行服务器编程实例_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、现在大多数语言都支持客户-服务器模式编程,其中VB给我们提供了很好的客户-服务器编程方式。下面我们用VB来实现TCFYIP网络编程。TCFy IP协议是Internet 最重要的协议。VB提供了 WinSock控件,用于在TCFYIP的基础上进行网络通信。当两个应用程序使用Socket 进行网络通信时,其中一个必须创建 Socket 服务器侦听,而另一个必须创建Socket 客户去连接服务器。这样两个程序就可以进行通信了。1 创建服务器,首先创建一个服务端口号。并开始侦听是否有客户请求连接。建立一窗体,并向其增加一个Winsock 控件 (可在工程菜单中的部件项来添加此控件 ),添加两文本框T

2、ext1,Text2, 和一按钮Command。 1Private Sub Form_Load()SockServer.LocalPort = 2000'服务器端口号,最好大于 1000SockServer.Listen '开始侦听End SubPrivate Sub Form_Unload(Cancel As Integer) SockServer.CloseEnd SubPrivate Sub SockServer_Close() SockServer.CloseEnd SubPrivate Sub SockServer_ConnectionRequest(ByVal re

3、questID As Long) SockServer.Close SockServer.Accept requestID '表示客户请求连接的ID号 End Sub'当客户向服务器发送数据到达后,产生DataArrival事件,在事件中接收数据 ,GetData 方法接收数据。Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockServer.GetData sText1.Text = sEnd Sub当我需要向客户发送数据时,只需调用 SendData方法。Private

4、 Sub Command1_Click()SockServer .SendData Text2.TextEnd Sub2创建客户。要创建客户连接服务器,首先设置服务器主机名,如IP 地址、域名或计算机名,然后设置服务器端口,最后连接服务器。建立一窗体,并向其增加一个Winsock 控件 (可在工程菜单中的部件项来添加此控件),取名为:SockCI。添加两文本框 Text1,Text2,和一按钮Command 1Private Sub Form_Load()SockCl.RemoteHost = ' "'表示服务器主机名SockCl.RemotePo

5、rt = 2000'表示服务器端口名SockCl.Connect连接到服务器End SubPrivate Sub Form_Unload(Cancel As Integer) SockCl.CloseEnd SubPrivate Sub SockCl_Close() SockCl.CloseEnd SubPrivate Sub SockCl_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockCl.GetData s '接收数据到文本框中Text1.Text = sEnd SubPrivate Sub Command1

6、_Click() SockCl.SendData Text2.Text '向服务器发送数据End Sub3.进行通信。把这两个窗体分别编译成两个EXES:件,服务器Server.exe和客户Client.exe 程序,并把它们分别安装在服务器端和客户端,这样就可以实现两者通信了。VB Socket 编程 (Winsock 控件创建TCP/IP 客户机 /服务器程序)Winsock控件建立在TCP UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。下面我们对Winsock 控件的事件、方法、属性按其

7、在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。下面是 Winsock 控件的相关属性,方法和事件。(略去一些暂用不到的)* 属性LocalHostName | 本地机器名LocalIP | 本地机器IP 地址LocalPort | 本地机器通信程序的端口(0 < 端口 <65536)RemoteHost | 远程机器名RemotePort | 远程机器的通信程序端口state | 连接的当前状态( 文后有详细说明)Protocal| 使用 TCP或 UDP>议(这里我们选0-sckTCPProtocal ') * 方法ListenListen 方法用于

8、服务器程序,等待客户访问。格式: Winsock 对象 .listenConnectConnect 方法用于向远程主机发出连接请求格式:Winsock对象.connect 远程主机IP,远程端口AcceptAccept 方法用于接受一个连接请求格式: Winsock 对象 .accept Request IDSenddata此方法用于发送数据格式: Winsock 对象 .senddata 数据Getdata用来取得接收到的数据格式: Winsock 对象 .getdata 变量 , 数据类型, 最大长度Close关闭当前连接格式: Winsock 对象 .close* 事件Close | 远

9、程机器关闭连接时触发Connect | 连接建立好,可以进行通信时触发( 客户端 )ConnectRequest | 有请求连接到达时产生(服务器端)DataArrival | 有数据到达时触发Error | 发生错误时发生SendProgress | 数据传送进度 服务器程序的实现过程是:( 1)服务器程序必须设置好LocalPort 属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP 应用程序没有使用过的值即可)。( 2)使用Listen 方法进入侦听状态,等待客户机程序的连接请求。( 3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest 事件,该事件

10、得到一个参数requestID 。( 4)服务器程序用Accept 方法接受客户机程序的requestID 请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为 其参数。( 5)当服务器程序接收到数据时,产生DataArrival 事件,参数BytesTotal 包含接收到的数据字节数。在该事件中,可以用GetData 方法接收数据。( 6)如果接受到Close 事件,则用Close 方法关闭TCP/IP 连接。客户机程序的实现过程是:(1)客户程序设置Remotehost属性,以便指定运行服务器程序的主机名,该字符串可在“控制

11、面板 | 网络 | 标识 | 计算机名”中查到。( 2)设置 RemotePort 属性 , 以便指定服务器程序的侦听端口。( 3)使用Connect 方法,向服务器提出连接请求。(4)服务器接受客户机程序的请求,客户机程序产生Connect事件,就可以用SendData 方法发送数据了。( 5)当客户机程序接收到数据时,产生DataArrival 事件,参数BytesTotal 包含接收到的数据字节数。在该事件中,可以用GetData 方法接收数据。( 6)如果接受到Close 事件,则用Close 方法关闭连接。Winsock控件还有两个重要的属性,即Protocol和State。Prot

12、ocol设定使用的协议是 TCP®是 UDP 取值 sckTCPProtocol 表示 TCP,取值 sckUDPProtocol 贝U表示 UDP 因为 Winsock 控件的缺省设置是sckTCPProtocol ,所以程序中并没有使用Protocol 属性。State 属性反映的是当前TCP/IP 的连接状态,取值如表1 所示。表 1 Winsock 控件的 State 属性及其描述常数 值 描述SckClosed 0 缺省值,关闭SckOpen 1 打开SckListening 2 侦听SckConnectionPending 3 连接挂起SckResolvingHost 4

13、 识别主机SckHostResolved 5 已识别主机SckConnecting 6 正在连接SckConnected 7 已连接SckClosing 8 同级人员正在关闭连接SckError 9 错误先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出 现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。服务器程序使用的控件如下:(1) Command 1退出按钮;(2) textsend :发

14、送数据文本框;(3) Winsockserver: 服务器Winsock;(4) textget :接收数据文本框。服务器程序的界面如图所示。服务器程序的源代码如下:Private Sub Command1_Click()EndEnd SubPrivate Sub Form_Load()textsend.Visible = Falsetextget.Visible = FalseWinsockserver.LocalPort = 1001Winsockserver.ListenEnd SubPrivate Sub textsend_Change()Winsockserver.SendData

15、textsend.TextEnd SubPrivate Sub Winsockserver_Close()Winsockserver.CloseEndEnd SubPrivate Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) textsend.Visible = Truetextget.Visible = TrueIf Winsockserver.State <> sckClosed Then Winsockserver.CloseWinsockserver.Accept requestIDEnd SubP

16、rivate Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)Dim tmpstr As StringWinsockserver.GetData tmpstrtextget.Text = tmpstrEnd Sub客户机程序使用的控件如下:(1) Command 1退出按钮;(2) Command2连接按钮;(3) Winsockclient:客户Winsock;(4) Text1 :主机名文本框;(5) Textsend :发送数据文本框;(6) Textget :接收数据文本框;客户机程序的源代码如下:Private Sub C

17、ommand1_Click()EndEnd SubPrivate Sub Command2_Click()Winsockclient.ConnectEnd SubPrivate Sub Form_Load()textsend.Visible = Falsetextget.Visible = FalseWinsockclient.RemotePort = 1001Winsockclient.RemoteHost = "sccdsz"End SubPrivate Sub Text1_Change()Winsockclient.RemoteHost = Text1.TextEnd

18、 SubPrivate Sub textsend_Change()Winsockclient.SendData textsend.TextEnd SubPrivate Sub Winsockclient_Close()Winsockclient.CloseEndEnd SubPrivate Sub winsockclient_Connect()textsend.Visible = Truetextget.Visible = TrueCommand2.Visible = FalseEnd SubPrivate Sub winsockclient_DataArrival(ByVal bytesTo

19、tal As Long)Dim tmpstr As StringWinsockclient.GetData tmpstrtextget.Text = tmpstrEnd Sub1 引言随着网络通信的兴起与迅速发展,TCP/IP协议已成为计算机网络中最主要的传输协 议,TCP/IP传输协议也越来越为人所熟知。目前的 Internet 网就是基于TCP/IP协议 的互联网络。TCP/IP除了用于广域外,在局域网中也广泛应用。TCP是传输控制协议,它提供了一种可靠的、面向会话连接的数据流服务,它可以在一个分组可能发生丢失、破坏、重复、延迟和乱序的不可靠物理网络之上通过确认、流控、复用同步等自动纠错技

20、术提供一种可靠的进程间通信机制,从而充分保证用户数据传送的可靠和有序性。使用TCPB议通彳S时,TCPS立并控制数据发送方与接收方的会话关系,当接收方正确收到数据后,必须向发送方发送确认信息。如果发送方在指定时间内未能收到确认信息,将重发数据包。IP 指分组交换协议,是联网的主机之间定义数据包传送路由的规则,它的基本任务是通过网络传送数据报,各个IP 数据报之间是相互独立的。IP 本身没有连接协议,在交换数据前不会建立会话关系。IP 收到数据后也不确认,发送方和接收方都不检测数据传输的正确性。所以仅有IP是不可靠的,不能确保正确传输数据。TCP与IP的组合则构成了功能完整的传输协议。在 TCP

21、/IP 网络应用中,多数网络应用程序是使用客户/服务器模型方式,客户向服务器发出服务请求,服务器作出应答响应,服务器通常在一个众所周知的地址侦听客户向服务器发出的请求,服务进程这时一直是处于休眠状态,直到有一个客户程序提出连接请求。服务器作出应答,并为客户提供相应的服务。客户/ 服务器模型最重要的特点是非对等相互作用,客户与服务器处于不平等的地位。服务器拥有客户机所不具备的各种软硬件资源和运算处理能力,服务器提供服务,客户请求服务,这种模式适应了网络资源、运算能力、信息分布不均等现象,成为IP 应用的主要模式。Internet 中的WW、 WFTP、 Telnet 、 E-mail 等许多典型

22、应用都是采用客户/服务器模型方式。Visual Basic 是Windows环境下简单、易学、高效的可视化编程语言开发系统,以其所见即所得的可视化界面设计风格和32 位面向对象的程序设计等特点,已广泛地应用于各个领域,是很多计算机软件开发人员采用的开发工具。VB不但提供了良好的界面设计能力,而且在网络通信方面的功能也很强。采用VB开发网络通信应用软件十分方便,尤其软件界面设计非常便捷,编程工作量较小,开发周期短。Visual Basic6.0 中提供了Winsock 控件,用于支持网络中两台以上计算机之间进行通信。Winsock控件提供了多样化的属性和方法来实现网络通信。通过设置Winsock

23、控件属性及调用控件方法就能够实现 TCP或UD叨式的网络通信。因此,使用 Winsock 控件编写网络通信程序的过程,实际上就是设置 Winsock控件属性和调用控件方法的过 程。利用这个控件,编程人员可以轻松地编写出TCP/IP 客户服务器程序。2 Winsock 控件Winsock控件是不可视控件,它提供了访问 TCP?口 UDFW络服务非常简便的途径, 使编程人员开发客户/服务器应用程序时,不必了解 TCP的细节或调用低级的 WinsockAPIs函数,只通过设置 Winsock控件的属性并调用其方法,就可直接连接到一 台远程计算机进行,并可实现双向数据交换。Microsoft Acce

24、ss、 Visual Baisc、 VisualC+域Visual FoxPro都可用其编写客户服务器程序。如果访问TCP传输控制协议服务功能,则须建立连接并实现主机问点对点通信。如 果访问UD吸据文报协议功能,则不建立连接,发送数据将以广播方式上网传输。3 TCP/IP 客户服务器程序设计方法使用TCP/IP协议通讯,首先要指定通信方式为 TC叨式,将Winsock控件的Protocol 属性设置为sckTCPProtocol.然后,按TCP!信协议规定,先要申请建立网络连接,然 后才能传输数据。3.1 服务器程序开始侦听网络服务器程序窗体中有三个 Winsock控件,Nam出另J为sckS

25、erver、sckBusy和 sckListen.其中 sckListen 是侦听控件;sckBusy 是; sckServer 连接控件。侦听控件和连接控件不能是同一个Winsock 控件。服务器程序必须首先侦听网络,等待客户的连接申请,才有可能建立网络连接。服务器程序开始侦听网络前,需要为侦听用(sckListen )控件的LocalPort 属性设置通信接口,然后调用Listen 方法。服务器程序开始侦听网络的程序代码如下:sckListen.LocalPort=4477 sckListen.Listen ' 侦听网络3.2 客户程序申请连接当服务器程序已经启动运行并开始侦听网络

26、后,在客户程序申请连接前,需要为客户 Winsock控件的RemodeHostH性设置远程主机,为 RemodePort属性设置通信接口,然后再调用Connect 方法向服务器程序申请连接。设置远程主机名,可以是计算机名也可是IP 地址。如果是主机计算机名,则需要系统翻译为相应的IP 地址;如果是主机IP 地址,则直接进行连接。申请连接的程序代码如下:sckClient.Protocol = sckTCPProtocol ' 设置协议为 TCP方式'IP 地址 "" 代表本机,与本机的实际地址无关sckClient.RemoteHost =

27、 """"' 设置远程主机接口号,该值必须与设置远程主机服务器程序的接口号一致sckClient.RemotePort = 4477sckClient.Connect ' 申请连接3.3 服务器程序应答连接请求服务器程序启动侦听网络后,当客户程序执行Connect 方法申请连接时,服务器程序的侦听控件(sckListen )触发 ConnectionRequest 事件,并传递连接请求句柄。编程人员需要在该当事件程序中调用连接控件(sckServer )的 Accept 方法实现连接。服务器程序应答

28、连接的程序代码如下:Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) sckServer.Accept requestID ' 应答连接请求End Sub当服务器程序执行Accept 方法建立连接后,客户程序中的接连控件将触发Connect事件通报连接完成,否则触发Error 事件通报连接失败。可以在该事件程序中加入连接后的处理程序。如果要求服务器程序支持多用户连接,则需要创建Winsock控件数组,在连接时动态生成 Winsock 控件与客户程序建立连接。程序代码应修改如下:Private Sub sck

29、Listen_ConnectionRequest(ByVal requestID As Long)Dim i As LongIf CurNumber<MaxNumber Then 'MaxNumber 为最大连接数,CurNumber为当前连接数For i = 1 To CurNumberIf sckServer(i).State = 0 Then ' 判断是否有空闲Winsock 控件Exit ForEnd IfNext iIf i = CurNumber ThenCurNumber = CurNumber + 1i = CurNumberEnd IfLoad sckS

30、erver(i) ' 动态加载Winsock 控件sckServer(i).Accept requestIDExit SubEnd IfsckBusy.ClosesckBusy.Accept requestIDEnd Sub3.4 传送数据当服务器程序和客户程序连接成功后,可以开始传送数据。建立连接后的服务器程序和客户程序都可以发送或接收数据。当一方要发送数据时,调用 SendData方法。Dim SendStr As StringSendStr = " 连接成功!"Winsock1.SendData SendStr ' 传送数据如果一方发送了数据,在连接的

31、另一方控件将产生DataArrival 事件,在DataArrival 事件处理程序中需要调用GetData 方法接收数据。接收数据类型必须与发送数据的类型一致方可正确接收数据。接收数据的程序代码如下:Dim RecStr As String sckClient.GetData RecStrPrint RecStr3.5 关闭连接当应用程序结束数据传送后,必须关闭连接,释放系统资源。当连接的一方关闭连接时,可以调用Close 方法。关闭连接程序代码如下:sckClient.Close ' 关闭连接一方执行关闭连接后,在连接的另一方控件将产生Close 事件。 程序需要处理事件,完成关闭

32、连接的最后工作。该事件的处理代码如下:Private Sub sckServer_Close() sckServer(Index).Close ' 释放接连 Unload sckServer(Index) ' 删除控件 End Sub4使用UDP!信方式程序设计方法UDP用户报文协议是一个无连接协议,与TCPB议操作不同,UDF议不使用报文确认机制,不对报文排序,不进行流控,因而UDP艮文可能出现丢失、重复、乱序等现象, 但由于它的前期工作比TCP少,计算机不建立连接,因而可以迅速地展开通信,一般用 于传输少量不重要的数据和信息。 Winsock控件的UDPS信方式是一种广播方

33、式,当UDP 主机发送数据时,网络上所有其它主机都能收到数据,UDPffi信比TCW式简单,由于UD杯需要连接,所以没有申请连接和关闭连接的过程。UD磔送者忽略接收者是否实际收到数据,而接收者也忽略发送者是否已发送了数据。这使编写UDR!信方式的网络程序非常简单。4.1 设置服务器程序中 Winsock控件的属性在服务器程序中,需要为 Winsock控件的LocalPort属性设置通信接口: sckserver.LocalPort=44774.2 客户程序发送数据当UDPfc机要发送数据时,可调用 SendData方法。发送数据程序的代码如下:Dim SendStr As StringSend

34、Str = " 发送信息!"sckClient.SendData SendStr ' 传送数据vb 映射已知服务器的方法VB 设定 /取消 网络磁盘 使用方法:建立连线Function AddConnection(ByVal RemoteLocation As String, _ByValLocalDriverAs String, _ByValPasswdAsString, _ByValUserNameAsString) As BooleanRemoteLocation :为网络磁盘原始来源,格式为RemoteComputerShareDirectoryLocalD

35、river :对应本机的磁盘代号,如:"H:"Passwd:存取网络磁盘的Password, 传 Null 表示不用密码UserName:存取网络磁盘的使用者代号成功时传回True,否则为False例:CallAddConnection("Shihcmias","x:", vbNullString,"cww")取消连线Function CancelConnection(ByVal LocalDriver As String, _ByValForceCloseAs Boolean) As BooleanLocalDr

36、iver :对应本机的磁盘代号,如:"H:"ForceClose : True表示强迫结束连线,而不管有没有程式正与之连线成功时传回True,否则为False 例:Call CancelConnection("x:", True)以下在 .basOption ExplicitType NETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment A

37、s String lpProvider As StringEnd TypeDeclare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As LongDeclare Function WNetCancelConnection2 Lib "

38、;mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As LongDeclare Function WNetGetLastError Lib "mpr.dll" Alias "WNetGetLastErrorA" (lpError As Long, ByVal lpErrorBuf As精品资料String,ByVal nErrorBufSizeAs Long, ByVal lpNameBuf AsString, ByVal nNameBufSize As Long) As LongPublic Const RESOURCE_PUBLICNET = &H2Public Const RESOURCETYPE_ANY = &H0Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0Public Const RESOURCEUSAGE_CONNECTABLE = &H1Public Const CONNECT_UPDATE_PROFILE =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论