admin管理员组

文章数量:1532647

2024年1月24日发(作者:)

利用总

VB进行服务器编程实例汇

现在大多数语言都支持客户-服务器模式编程,其中VB给我们提供了很好的客户-服务器编程方式。下面我们用VB来实现TCP/IP网络编程。

TCP/IP协议是Internet最重要的协议。VB提供了WinSock控件,用于在TCP/IP的基础上进行网络通信。当两个应用程序使用Socket进行网络通信时,其中一个必须创建Socket服务器侦听,而另一个必须创建Socket客户去连接服务器。这样两个程序就可以进行通信了。

1.创建服务器,首先创建一个服务端口号。并开始侦听是否有客户请求连接。

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

Private Sub Form_Load()

ort = 2000 ′服务器端口号,最好大于1000

′开始侦听

End Sub

Private Sub Form_Unload(Cancel As Integer)

End Sub

Private Sub SockServer_Close()

End Sub

Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)

requestID ′表示客户请求连接的ID号

End Sub

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

Private Sub SockServer_Data

Arrival(ByVal bytesTotal As Long)

Dim s As String

a s

= s

End Sub

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

Private Sub Command1_Click()

SockServer .SendData

End Sub

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

*属性

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

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对象.accept Request ID

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所示。

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

常数 值 描述

SckClosed 0 缺省值,关闭

SckOpen 1 打开

SckListening 2 侦听

SckConnectionPending 3 连接挂起

SckResolvingHost 4 识别主机

SckHostResolved 5 已识别主机

SckConnecting 6 正在连接

SckConnected 7 已连接

SckClosing 8 同级人员正在关闭连接

SckError 9 错误

先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出 现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。

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

(1)Command1:退出按钮;

(2)textsend:发送数据文本框;

(3)Winsockserver: 服务器Winsock;

(4)textget :接收数据文本框。

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

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

Private Sub Command1_Click()

End

End Sub

Private Sub Form_Load()

e = False

e = False

ort = 1001

End Sub

Private Sub textsend_Change()

ta

End Sub

Private Sub Winsockserver_Close()

End

End Sub

Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)

e = True

e = True

If <> sckClosed Then

requestID

End Sub

Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)

Dim tmpstr As String

a tmpstr

= 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()

t

End Sub

Private Sub Form_Load()

e = False

e = False

Port = 1001

Host = "sccdsz"

End Sub

Private Sub Text1_Change()

Host =

End Sub

Private Sub textsend_Change()

ta

End Sub

Private Sub Winsockclient_Close()

End

End Sub

Private Sub winsockclient_Connect()

e = True

e = True

e = False

End Sub

Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)

Dim tmpstr As String

a tmpstr

= tmpstr

End Sub

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等许多典型应用都是采用客户/服务器模型方式。

Visual Basic是Windows环境下简单、易学、高效的可视化编程语言开发系统,以其所见即所得的可视化界面设计风格和32位面向对象的程序设计等特点,已广泛地应用于各个领域,是很多计算机软件开发人员采用的开发工具。VB不但提供了良好的界面设计能力,而且在网络通信方面的功能也很强。采用VB开发网络通信应用软件十分方便,尤其软件界面设计非常便捷,编程工作量较小,开发周期短。

Visual Basic6.0中提供了Winsock控件,用于支持网络中两台以上计算机之间进行通信。Winsock控件提供了多样化的属性和方法来实现网络通信。通过设置Winsock控件属性及调用控件方法就能够实现TCP或UDP方式的网络通信。因此,使用Winsock控件编写网络通信程序的过程,实际上就是设置Winsock控件属性和调用控件方法的过程。利用这个控件,编程人员可以轻松地编写出TCP/IP客户服务器程序。

2 Winsock控件

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

Baisc、Visual C++或Visual FoxPro都可用其编写客户服务器程序。

如果访问TCP传输控制协议服务功能,则须建立连接并实现主机间点对点通信。如果访问UDP数据文报协议功能,则不建立连接,发送数据将以广播方式上网传输。

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

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

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

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

其中sckListen是侦听控件;sckBusy是;sckServer连接控件。侦听控件和连接控件不能是同一个Winsock控件。

服务器程序必须首先侦听网络,等待客户的连接申请,才有可能建立网络连接。服务器程序开始侦听网络前,需要为侦听用(sckListen)控件的LocalPort属性设置通信接口,然后调用Listen方法。服务器程序开始侦听网络的程序代码如下:

ort=4477 '侦听网络

3.2客户程序申请连接

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

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

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

ol = sckTCPProtocol '设置协议为TCP方式

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

Host = "127.0.0.1""129.200.0.1"

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

Port = 4477

t '申请连接

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

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

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

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

Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)

requestID '应答连接请求

End Sub

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

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

Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)

Dim i As Long

If CurNumber

For i = 1 To CurNumber

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

Exit For

End If

Next i

If i = CurNumber Then

CurNumber = CurNumber + 1

i = CurNumber

End If

Load sckServer(i) '动态加载Winsock控件

sckServer(i).Accept requestID

Exit Sub

End If

requestID

End Sub

3.4传送数据

当服务器程序和客户程序连接成功后,可以开始传送数据。建立连接后的服务器程序和客户程序都可以发送或接收数据。当一方要发送数据时,调用SendData方法。

Dim SendStr As String

SendStr = "连接成功!"

ta SendStr '传送数据

如果一方发送了数据,在连接的另一方控件将产生DataArrival事件,在DataArrival事件处理程序中需要调用GetData方法接收数据。接收数据类型必须与发送数据的类型一致方可正确接收数据。接收数据的程序代码如下:

Dim RecStr As String

a RecStr

Print RecStr

3.5关闭连接

当应用程序结束数据传送后,必须关闭连接,释放系统资源。当连接的一方关闭连接时,可以调用Close方法。关闭连接程序代码如下:

'关闭连接

一方执行关闭连接后,在连接的另一方控件将产生Close事件。程序需要处理事件,完成关闭连接的最后工作。该事件的处理代码如下:

Private Sub sckServer_Close()

sckServer(Index).Close '释放接连

Unload sckServer(Index) '删除控件

End Sub

4 使用UDP通信方式程序设计方法

UDP用户报文协议是一个无连接协议,与TCP协议操作不同,UDP协议不使用报文确认机制,不对报文排序,不进行流控,因而UDP报文可能出现丢失、重复、乱序等现象,但由于它的前期工作比TCP少,计算机不建立连接,因而可以迅速地展开通信,一般用于传输少量不重要的数据和信息。Winsock控件的UDP通信方式是一种广播方式,当UDP主机发送数据时,网络上所有其它主机都能收到数据,UDP通

信比TCP方式简单,由于UDP不需要连接,所以没有申请连接和关闭连接的过程。UDP发送者忽略接收者是否实际收到数据,而接收者也忽略发送者是否已发送了数据。这使编写UDP通信方式的网络程序非常简单。

4.1 设置服务器程序中Winsock控件的属性

在服务器程序中,需要为Winsock控件的LocalPort属性设置通信接口:

ort=4477

4.2 客户程序发送数据

当UDP主机要发送数据时,可调用SendData方法。发送数据程序的代码如下:

Dim SendStr As String

SendStr = "发送信息!"

ta SendStr '传送数据

vb映射已知服务器的方法

VB 设定/取消 网络磁盘

使用方法:

建立连线

Function AddConnection(ByVal RemoteLocation As String, _

ByVal LocalDriver

As String, _

ByVal Passwd As

String, _

ByVal UserName As

String) As Boolean

RemoteLocation : 为网络磁盘原始来源,格式为

RemoteComputerShareDirectory

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 : 对应本机的磁盘代号,如: "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 Type

Declare Function WNetAddConnection2 Lib "" Alias

"WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal

lpPassword As String, ByVal lpUserName As String, ByVal

dwFlags As Long) As Long

Declare Function WNetCancelConnection2 Lib "" Alias

"WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags

As Long, ByVal fForce As Long) As Long

Declare Function WNetGetLastError Lib "" 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,

ByVal LocalDriver As String, _

ByVal

Passwd As String, ByVal UserName As String) As Boolean

Dim ne As NETRESOURCE, i As Long

Dim errstr As String, errpriv As String, erno As Long

layType = RESOURCEDISPLAYTYPE_GENERIC

e = RESOURCE_PUBLICNET

= RESOURCETYPE_ANY

e = RESOURCEUSAGE_CONNECTABLE

ent = vbNullString

lName = LocalDriver

ider = vbNullString

teName = RemoteLocation

i = WNetAddConnection2(ne, Passwd, UserName, 0)

If i = 0 Then

AddConnection = True

Else

AddConnection = False

errstr = String(256, 0)

errpriv = String(256, 0)

i = WNetGetLastError(erno, errstr, 256, errpriv, 256)

errstr = Left(errstr, InStr(1, errstr, Chr(0)) - 1)

MsgBox errstr, vbCritical

End If

End Function

Public Function CancelConnection(ByVal LocalDriver As String,

ByVal ForceClose As Boolean) As Boolean

Dim i As Long

Dim errstr As String, errpriv As String, erno As Long

i = WNetCancelConnection2(LocalDriver, 0, IIf(ForceClose, 1,

0))

If i = 0 Then

CancelConnection = True

Else

CancelConnection = False

errstr = String(256, 0)

errpriv = String(256, 0)

i = WNetGetLastError(erno, errstr, 256, errpriv, 256)

errstr = Left(errstr, InStr(1, errstr, Chr(0)) - 1)

MsgBox errstr, vbCritical

End If

End Function

本文标签: 连接控件服务器客户服务器程序