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

下载本文档

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

文档简介

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

2、ommand1。Private 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 requestID As Long)SockServer.Clo

3、seSockServer.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 Sub Command1_Click()SockServer .SendData Text

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

5、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_Click()SockCl.SendData Text2.Text 向服务器发送数据End Sub3进行通信。把这两个窗体分别编译成两个EXE文件,服务器Se

6、rver.exe和客户Client.exe 程序,并把它们分别安装在服务器端和客户端,这样就可以实现两者通信了。VB Socket编程(Winsock控件创建TCP/IP客户机/服务器程序)Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一 个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。 下面是Winsock控件的相关属性,方法和事件。(略去一些暂用不到的) *属性 - LocalHostName | 本地机

7、器名 LocalIP | 本地机器IP地址 LocalPort | 本地机器通信程序的端口(0 端口 65536) RemoteHost | 远程机器名 RemotePort | 远程机器的通信程序端口 state | 连接的当前状态(文后有详细说明) Protocal | 使用TCP或UDP协议(这里我们选0-sckTCPProtocal) - *方法 - Listen Listen方法用于服务器程序,等待客户访问。 格式:Winsock对象.listen Connect Connect方法用于向远程主机发出连接请求 格式:Winsock对象.connect 远程主机IP,远程端口 Acce

8、pt Accept方法用于接受一个连接请求 格式:Winsock对象.accept Request ID Senddata 此方法用于发送数据 格式:Winsock对象.senddata 数据 Getdata 用来取得接收到的数据 格式:Winsock对象.getdata 变量 ,数据类型 ,最大长度 Close 关闭当前连接 格式:Winsock对象.close *事件 - Close | 远程机器关闭连接时触发 Connect | 连接建立好,可以进行通信时触发(客户端) ConnectRequest | 有请求连接到达时产生(服务器端) DataArrival | 有数据到达时触发 Er

9、ror | 发生错误时发生 SendProgress | 数据传送进度 - 服务器程序的实现过程是: (1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过的值即可)。 (2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。 (3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。 (4)服务器程序用Accept方法接受客户机程序的requestID请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的r

10、equestID作为其参数。 (5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。 (6)如果接受到Close事件,则用Close方法关闭TCP/IP连接。 客户机程序的实现过程是: (1) 客户程序设置Remotehost属性,以便指定运行服务器程序的主机 名,该字符串可在“控制面板|网络|标识|计算机名”中查到。 (2) 设置RemotePort属性,以便指定服务器程序的侦听端口。 (3)使用Connect方法,向服务器提出连接请求。 (4)服务器接受客户机程序的请求,客户机程序产生C

11、onnect事件,就可以用SendData方法发送数据了。 (5)当客户机程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。 (6)如果接受到Close事件,则用Close方法关闭连接。 Winsock控件还有两个重要的属性,即Protocol和State。Protocol设定使用的协议是TCP还是UDP:取值 sckTCPProtocol表示TCP, 取值sckUDPProtocol则表示UDP。因为Winsock控件的缺省设置是sckTCPProtocol,所以程序中并没有使用 Protocol属

12、性。State属性反映的是当前TCP/IP的连接状态,取值如表1所示。 表1 Winsock控件的State属性及其描述 常数 值 描述 SckClosed 0 缺省值,关闭 SckOpen 1 打开 SckListening 2 侦听 SckConnectionPending 3 连接挂起 SckResolvingHost 4 识别主机SckHostResolved 5 已识别主机 SckConnecting 6 正在连接 SckConnected 7 已连接 SckClosing 8 同级人员正在关闭连接 SckError 9 错误 先在一台计算机上运行服务器程序,此时窗口上只有一个“退出

13、”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出 现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。 服务器程序使用的控件如下: (1)Command1:退出按钮; (2)textsend:发送数据文本框; (3)Winsockserver: 服务器Winsock; (4)textget :接收数据文本框。 服务器程序的界面如图所示。 服务器程序的源代码如下: Private Sub Command1_Click() End End Sub Pri

14、vate Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockserver.LocalPort = 1001 Winsockserver.Listen End Sub Private Sub textsend_Change() Winsockserver.SendData textsend.Text End Sub Private Sub Winsockserver_Close() Winsockserver.Close End End SubPrivate Sub Winsockserver_Conn

15、ectionRequest(ByVal requestID As Long) textsend.Visible = True textget.Visible = True If Winsockserver.State sckClosed Then Winsockserver.Close Winsockserver.Accept requestID End Sub Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As StringWinsockserver.GetData tmpstr text

16、get.Text = tmpstr End Sub 客户机程序使用的控件如下: (1)Command1:退出按钮; (2)Command2:连接按钮; (3)Winsockclient:客户Winsock; (4)Text1:主机名文本框; (5)Textsend:发送数据文本框; (6)Textget:接收数据文本框; 客户机程序的源代码如下: Private Sub Command1_Click() End End Sub Private Sub Command2_Click() Winsockclient.Connect End Sub Private Sub Form_Load() t

17、extsend.Visible = False textget.Visible = False Winsockclient.RemotePort = 1001 Winsockclient.RemoteHost = sccdsz End Sub Private Sub Text1_Change() Winsockclient.RemoteHost = Text1.Text End Sub Private Sub textsend_Change() Winsockclient.SendData textsend.Text End Sub Private Sub Winsockclient_Clos

18、e() Winsockclient.Close End End Sub Private Sub winsockclient_Connect() textsend.Visible = True textget.Visible = True Command2.Visible = False End Sub Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockclient.GetData tmpstr textget.Text = tmpstr End Sub1 引言

19、随着网络通信的兴起与迅速发展,TCP/IP协议已成为计算机网络中最主要的传输协议,TCP/IP传输协议也越来越为人所熟知。目前的Internet 网就是基于TCP/IP协议的互联网络。TCP/IP除了用于广域外,在局域网中也广泛应用。 TCP是传输控制协议,它提供了一种可靠的、面向会话连接的数据流服务,它可以在一个分组可能发生丢失、破坏、重复、延迟和乱序的不可靠物理网络之上通过确认、流控、复用同步等自动纠错技术提供一种可靠的进程间通信机制,从而充分保证用户数据传送的可靠和有序性。使用TCP协议通信时,TCP建立并控制数据发送方与接收方的会话关系,当接收方正确收到数据后,必须向发送方发送确认信息

20、。如果发送方在指定时间内未能收到确认信息,将重发数据包。 IP指分组交换协议,是联网的主机之间定义数据包传送路由的规则,它的基本任务是通过网络传送数据报,各个IP数据报之间是相互独立的。IP本身没有连接协议,在交换数据前不会建立会话关系。IP收到数据后也不确认,发送方和接收方都不检测数据传输的正确性。所以仅有IP是不可靠的,不能确保正确传输数据。TCP与IP的组合则构成了功能完整的传输协议。 在TCP/IP网络应用中,多数网络应用程序是使用客户/服务器模型方式,客户向服务器发出服务请求,服务器作出应答响应,服务器通常在一个众所周知的地址侦听客户向服务器发出的请求,服务进程这时一直是处于休眠状态

21、,直到有一个客户程序提出连接请求。服务器作出应答,并为客户提供相应的服务。客户/服务器模型最重要的特点是非对等相互作用,客户与服务器处于不平等的地位。服务器拥有客户机所不具备的各种软硬件资源和运算处理能力,服务器提供服务,客户请求服务,这种模式适应了网络资源、运算能力、信息分布不均等现象,成为IP应用的主要模式。Internet中的WWW、FTP、Telnet、E-mail等许多典型应用都是采用客户/服务器模型方式。 Visual Basic是Windows环境下简单、易学、高效的可视化编程语言开发系统,以其所见即所得的可视化界面设计风格和32位面向对象的程序设计等特点,已广泛地应用于各个领域

22、,是很多计算机软件开发人员采用的开发工具。VB不但提供了良好的界面设计能力,而且在网络通信方面的功能也很强。采用VB开发网络通信应用软件十分方便,尤其软件界面设计非常便捷,编程工作量较小,开发周期短。 Visual Basic6.0中提供了Winsock控件,用于支持网络中两台以上计算机之间进行通信。Winsock控件提供了多样化的属性和方法来实现网络通信。通过设置Winsock控件属性及调用控件方法就能够实现TCP或UDP方式的网络通信。因此,使用Winsock控件编写网络通信程序的过程,实际上就是设置Winsock控件属性和调用控件方法的过程。利用这个控件,编程人员可以轻松地编写出TCP/

23、IP客户服务器程序。 2 Winsock控件 Winsock控件是不可视控件,它提供了访问TCP和UDP网络服务非常简便的途径,使编程人员开发客户/服务器应用程序时,不必了解TCP的细节或调用低级的WinsockAPIs函数,只通过设置Winsock控件的属性并调用其方法,就可直接连接到一台远程计算机进行,并可实现双向数据交换。Microsoft Access、Visual Baisc、Visual C+或Visual FoxPro都可用其编写客户服务器程序。 如果访问TCP传输控制协议服务功能,则须建立连接并实现主机间点对点通信。如果访问UDP数据文报协议功能,则不建立连接,发送数据将以广播

24、方式上网传输。 3 TCP/IP客户服务器程序设计方法 使用TCP/IP协议通讯,首先要指定通信方式为TCP方式,将Winsock控件的Protocol属性设置为sckTCPProtocol.然后,按TCP通信协议规定,先要申请建立网络连接,然后才能传输数据。 3.1服务器程序开始侦听网络 服务器程序窗体中有三个Winsock控件,Name分别为sckServer、sckBusy和sckListen. 其中sckListen是侦听控件;sckBusy是;sckServer连接控件。侦听控件和连接控件不能是同一个Winsock控件。 服务器程序必须首先侦听网络,等待客户的连接申请,才有可能建立网

25、络连接。服务器程序开始侦听网络前,需要为侦听用(sckListen)控件的LocalPort属性设置通信接口,然后调用Listen方法。服务器程序开始侦听网络的程序代码如下: sckListen.LocalPort=4477 sckListen.Listen 侦听网络 3.2客户程序申请连接 当服务器程序已经启动运行并开始侦听网络后,在客户程序申请连接前,需要为客户Winsock控件的RemodeHost属性设置远程主机,为RemodePort属性设置通信接口,然后再调用Connect方法向服务器程序申请连接。 设置远程主机名,可以是计算机名也可是IP地址。如果是主机计算机名,则需要系统翻译为

26、相应的IP地址;如果是主机IP地址,则直接进行连接。 申请连接的程序代码如下:sckClient.Protocol = sckTCPProtocol 设置协议为TCP方式IP地址代表本机,与本机的实际地址无关sckClient.RemoteHost = 设置远程主机接口号,该值必须与设置远程主机服务器程序的接口号一致sckClient.RemotePort = 4477sckClient.Connect 申请连接 3.3服务器程序应答连接请求 服务器程序启动侦听网络后,当客户程序执行Connect方法申请连接时,服务器程序的侦听控件(s

27、ckListen)触发ConnectionRequest事件,并传递连接请求句柄。编程人员需要在该当事件程序中调用连接控件(sckServer)的Accept方法实现连接。 服务器程序应答连接的程序代码如下:Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)sckServer.Accept requestID 应答连接请求End Sub 当服务器程序执行Accept方法建立连接后,客户程序中的接连控件将触发Connect事件通报连接完成,否则触发Error事件通报连接失败。可以在该事件程序中加入连接后的处理程序。 如

28、果要求服务器程序支持多用户连接,则需要创建Winsock控件数组,在连接时动态生成Winsock控件与客户程序建立连接。程序代码应修改如下:Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)Dim i As LongIf CurNumberMaxNumber Then MaxNumber为最大连接数,CurNumber为当前连接数For i = 1 To CurNumberIf sckServer(i).State = 0 Then 判断是否有空闲Winsock控件Exit ForEnd IfNext iIf i =

29、 CurNumber ThenCurNumber = CurNumber + 1i = CurNumberEnd IfLoad sckServer(i) 动态加载Winsock控件sckServer(i).Accept requestIDExit SubEnd IfsckBusy.ClosesckBusy.Accept requestIDEnd Sub 3.4传送数据 当服务器程序和客户程序连接成功后,可以开始传送数据。建立连接后的服务器程序和客户程序都可以发送或接收数据。当一方要发送数据时,调用SendData方法。Dim SendStr As StringSendStr = 连接成功!Wi

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

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

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

33、dStr As StringSendStr = 发送信息!sckClient.SendData SendStr 传送数据vb映射已知服务器的方法VB 设定/取消 网络磁盘使用方法: 建立连线 Function AddConnection(ByVal RemoteLocation As String, _ ByVal LocalDriver As String, _ ByVal Passwd As String, _ ByVal UserName As String) As Boolean RemoteLocation : 为网络磁盘原始来源,格式为 RemoteComputerShareDir

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

35、: H: ForceClose : True表示强迫结束连线,而不管有没有程式正与之连线 成功时传回True,否则为False 例: Call CancelConnection(x:, True) 以下在.bas Option Explicit Type NETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment As String lpProvider As String End T

36、ype Declare Function WNetAddConnection2 Lib mpr.dll Alias WNetAddConnection2A (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long Declare Function WNetCancelConnection2 Lib mpr.dll Alias WNetCancelConnection2A (ByVal lpName As String,

37、 ByVal dwFlags As Long, ByVal fForce As Long) As Long Declare Function WNetGetLastError Lib mpr.dll Alias WNetGetLastErrorA (lpError As Long, ByVal lpErrorBuf As String, ByVal nErrorBufSize As Long, ByVal lpNameBuf As String, ByVal nNameBufSize As Long) As Long Public Const RESOURCE_PUBLICNET = &H2 Public Const RESOURCETYPE_ANY = &H0 Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0 Public Const RESOURCEUSAGE_CONNECTABLE = &H1 Public Const CONNECT_UPDATE_PROFILE = &H1 Public Function AddConnection(ByVal RemoteLocation As String,

温馨提示

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

评论

0/150

提交评论