您好, 访客   登录/注册

VB中Winsock控件及其数组概述

来源:用户上传      作者: 王建民

  摘 要: 本文介绍利用WinSock控件及控件数组建立连接,并讨论怎样实现客户机/服务器模式下一个服务端同时为多个客户端提供WinSock连接。
  关键词: VB WinSock控件 数组
  
  随着计算机局域网的不断发展、普及,网络版软件也越来越体现出了网络时代的优点与其先进性。往往此类软件都会有一个服务端,由服务端控制着若干客户端的运行。一般来说,服务端和客户端之间都要进行大量的信息传送,而其中很多就是使用WinSock控件。
  
  一、WinSock控件的基础知识
  
  WinSock控件对用户来说是不可见的,它提供了访问TCP和UDP网络服务的方便途径。使用WinSock编写网络应用程序,不必了解网络协议的细节或调用低级的WinSock API,通过对WinSock控件的属性设置和方法调用就可以轻易实现计算机之间的连接,并且还可以实现双向交换数据。
  1.常用属性
  LocalPort:本地通信程序(WinSock)的端口号。
  RemoteHost:远程机器名,机器名也可以是IP地址。
  RemoteHostIP:远程机器IP地址。RemoteHost和RemoteHostIP属性只设置其中之一。
  RemotePort:远程通信程序(WinSock)端口号。
  Protocol:使用协议。可选的协议是TCP和UDP,对应的VB的常量分别是sck、TCP、Protocol和sck、UDP、Protocol,Winsock控件默认协议是TCP。
  2.常用方法
  Accept:接受一个连接请求。格式:对象.accept requestID。
  Bind:多协议接口下,把接口卡、IP地址捆绑在一起。格式:对象.Bind端口号,IP。
  Close:关闭连接。格式:对象.Close。
  Connect:发送连接请求。格式:对象.Connect(IP,远程端口)。
  GetData:取出数据后清除数据缓冲区。格式:对象.Getdata变量。
  PeekData:取出数据后,但不清除数据缓冲区。格式:对象.Peekdata变量。
  Listen:进入监听状态,以便及时对连接请求进行响应。格式:对象.Listen。
  SendData:发送数据。格式:对象.SendData data。
  3.常用事件
  Close:远程设备关闭连接时触发事件。
  Connect:建立连接,进行通信时触发。
  ConnectionRequest:有连接请求时触发。
  DataArrival:有数据到达时触发。
  
  二、WinSock控件应用方法
  
  1.WinSock连接过程
  网络应用软件中,必须有服务端和客户端。服务端能够接受客户端的连接请求,而连接必须由客户端发起。具体过程如下。
  准备工作:
  服务端:设置WinSock端口号(LocalPort),使用协议(Protocol),如果机器中有两块以上的网卡,则需要进行端口绑定(Bind),使用Listen方法进入监听状态,等待响应客户端的连接请求。
  客户端:设置WinSock远程计算机名或IP地址(RemoteHost或RemoteHostIP),设置远程计算机端口号(此处要和服务端端口号一致),使用协议(Protocol)。
  连接过程:
  第一步,由客户端使用Connect方法请求建立连接。
  第二步,服务端接收到连接请求,触发ConnectionRequest事件,同时得到一个requestID参数。
  第三步,服务端使用Accept方法建立连接,该方法必须用到上一步得到的requestID参数,Listen状态自动结束。
  第四步,连接建立后,客户端会触发Connect事件(如果设置响应的话)。
  第五步,双方可以进行双向数据传输,使用SendData方法发送数据,接收方接收到数据后,会触发DataArrival事件,使用GetData或PeerData方法接收数据。
  第六步,任意一方发出结束请求(Close)或直接关闭,对方触发Close事件(如果设置相应的话)。
  以上就是一个WinSock连接实施的全过程,适应于一个服务端对应一个客户端的情况。但是实际应用中,往往是一个服务端可能要同时和多个客户端连接,而所有的客户端设置的远程端口号是相同的。从上面的连接过程可以看出,当服务端响应某个客户端的连接请求后,服务端的监听状态随即结束,客户端的连接请求也不会再被响应,也就是说,服务端不能够同时和多个客户端连接。为了使得服务端能够同时和多个客户端同时连接,我们往往在服务端采用WinSock控件数组来进行连接。
  2.WinSock控件数组的应用
  应用WinSock控件数组,能够轻松实现一个服务端对应多个客户端的连接请求,从而实现一对多的网络版应用程序。其原理如下:
  将WinSock控件的Index属性设置为0,使之成为一个控件数组,再设置端口号等参数,用Listen方法使WinSock(0)控件进入监听状态。有客户端请求连接时,WinSock(0)会触发ConnectionRequest事件,此时,不使用WinSock(0)响应连接请求,而是装入一个WinSock(i)控件,由WinSock(i)调用Accept方法建立连接。建立连接时,只需要在Accept后面注明从WinSock(0)的ConnectionRequest事件中得来的requestID参数,即可实现WinSock(i)和客户端的连接。由于连接时未使用WinSock(0),所以其监听状态并未改变,还可以响应其它客户端发出的连接请求。
  
  参考文献:
  [1]李立宗.VB程序设计教程[M].南开大学出版社,2009.2.
  [2]Andrew S.Tanenbaum.计算机网络(第4版)[M].清华大学出版社,2004.8.
  [3]袁帅等.Visual Basic编程实例教程[M].北京希望电子出版社,2002.11.


转载注明来源:https://www.xzbu.com/9/view-979686.htm