郭 毅 涂婧璐
摘要:简要介绍了VB网络通信中收发数据的原理及方式,给出了UDP协议下通信的源代码,通过在校园一卡通系统中的应用实例,着重讲述了一种利用计时器控件进行接收并处理多帧数据的简易控制方法,并提供了实现方法的主要源代码。文章的最后指出了这种方法的不足之处。
关键词:网络通信;多帧数据;计时器控件
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)18-20000-00
The Simple Method of The Multi-frame Data Receiving In VB Network Communication
GUO Yi,TU Jing-lu
(Department of Information Technology,Hainan Vocational College of Political Science and Law,Haikou 571100,China)
Abstract: The principles and methods of receieing data are introduced briefly in VB network communication, has given the source code which under the UDP protocol.Adopted in the campus card system of examples, focusing on the use of the timer controls to receive and process Multi-frame data simple control method. Finally,the article has pointed out the lack of this methods.
Key words:Network Communication; Multi-frame Data; Timer Control
1 引言
随着网络技术的发展,网络应用越来越深入人们的生活,由此引发的网络设备及相应软件的开发工作也日益增
加。我们学院的校园一卡通系统就是在这个时期应运而生的,并且随着时代的发展、学院日益扩大的应用需求而不断更新升级。在最新增加的学生宿舍网络收费功能的设计中,遇到了一个接收多帧数据的问题,现应用一种简易的方法解决,特与应用VB6.0进行网络通信设计的同仁们共享。
2 VB网络通信
在一卡通的脱网消费系统中,由于消费记录是暂时存在消费机中的,需要定时下载数据并清空,才不会导致因存储器没有空间而不允许刷卡的事情产生,但如果每天下载数据又会增加工作人员的工作量。由于我们所使用的消费机存储容量可达32KB,而我们一条记录只占用16B,这样我们的一台消费机中可存储2048条记录。以我院校园网规模来看,现通过校园网上网的学生在400人左右,即使只有一台消费机每人每天消费扣款,也可存储5天的数据,但这样一次传输到上位机的数据量就比较大,因此我们的消费机把数据分成多帧来上传(每一帧传输40条记录,加上帧头和帧尾共649个字节),这样便产生了本文所提出的问题——如何利用Winsock控件的DataArrival事件来接收多帧数据?
VB5.0以上的版本都提供了Winsock控件,Winsock使用的TCP协议和UDP协议允许建立并保持一个到远程计算机上的连接,且可以在连接结束之前实时地进行数据交换。用户仅通过设置属性并借助事件处理就能够轻而易举地连接到一个远程的计算机上。
我们的消费系统采用的是UDP协议,它是无连接的,并不保证数据传输的可靠性、有序性和无重复性,因此需要程序员负责管理数据报文的排序和可靠性,这对程序的严谨性也有了更高的要求。下面我们把在VB6.0中使用Winsock控件实现UDP协议的方法简单地描述一下,在这里上位机为本地机器,下位机(消费机)视为远程计算机。
在程序中用到的Winsock控件的主要属性如下表所示:
表1Winsock控件的属性
由于UDP协议是无连接的,不保证接收端是否在侦听,所以使用的方法也比较少,本系统中用到的主要方法有:Bind、SendData和GetData等方法,其中Bind方法用于绑定本地端口;SendData方法用于发送数据;GetData方法一般用于DataArrival事件中,获取当前数据缓冲区中的数据并将其存储在变体类型的变量中。在程序中所用到的属性一般在窗体加载时便设置好,并使用Bind方法来绑定本地端口,代码如下:
Dim a as Integer ‘数组下标计数器
Dim b as Integer ‘帧计数器
Dim revHead() as Byte ‘存放收到的所有数据的数组
Dim intfrmcount as integer ‘总帧数
Private Sub Form_Load()
sckMultFrm.RemoteHost = IPadd ‘设置远程IP
sckMultFrm.RemotePort = 5010 ‘设置远程端口
sckMultFrm.LocalPort = 5009 ‘设置本地端口
sckMultFrm.Bind 5009 ‘绑定本地端口
End Sub
通过单击命令按钮事件来发送命令,代码如下:
Private Sub Send_Click()
Dim bytreadRecord() As Byte
sckMultFrm.SendData bytreadRecord ‘发送命令,其中bytreadRecord为字节型数组
a = 0:b = 0 ‘计数器清零
Timer1.Interval = 2000 ‘预计第一帧数据接收并处理完的时间为2S
End Sub
当消费机有数据上传时,将触发Winsock控件的DataArrival事件,该事件当新数据到达时发生。这里将每次收到的帧数据都保存到一个一维数组中,具体代码如下:
Private Sub sckMultFrm_DataArrival(ByVal bytesTotal As Long)
Dim frmrevHead As Variant
b = b + 1 ‘b用于计算帧数
lenByte = 649 * b – 1 ‘计算接收数据的总字节数
sckMultFrm.GetData frmrevHead ‘接收单帧数据
ReDim Preserve revHead(0 To lenByte)‘定义动态数组存放接收到的所有数据
For j = 0 To 648
revHead(a) = frmrevHead(j)
a = a + 1 ‘a用于累计数据字节数,将每帧收到的变体型数组元素放到一个数组中
Next
End Sub
3 用Timer控件实现多帧的接收
由于只要数据缓冲区有数据,Winsock控件就会触发DataArrival事件,并且把接收到的数据存入一个变体型变量中,而我们的下位机每上传一帧数据的间隔时间是毫秒级的,上位机软件还来不及处理完第一帧数据,第二帧数据又来了,这样使用一个变量来接收数据就有点力不从心,而且会发生丢数据的情况,为了解决这种矛盾,我们想到了利用Timer控件来控制处理接收数据的时间。
首先我们设置一个计时器控件Timer1,用它来处理接收到的第一帧数据,在它的Timer事件中获取表示总帧数的那个字节的数据,根据该字节的帧数我们再来设置Timer2的Interval(时间间隔)属性,该属性控制当全部消费机数据(所有帧)传输完毕后触发Timer事件的时间,在此事件中对全部接收到的数据进行处理。
Private Sub Timer1_Timer()
Timer1.Interval = 0
intfrmcount = revHead(6) ‘读取总帧数字节(据自定义协议而定),帧数从0开始记数
If intfrmcount = 0 Then ‘为0表示只有一帧,则Timer2不用等待
Timer2.Interval = 10 ‘只需10mS就可以处理已收到的第一帧数据了
Else
Timer2.Interval = intfrmcount * 1000 ‘若帧数不为0,则延长Timer2的等待时间
End If
End Sub
当全部帧都存入到动态数组revHead()中后,就可在Timer2控件的Timer事件中来处理下位机上传的所有的数据。
Private Sub Timer2_Timer()
Dim count As Integer
Timer2.Interval = 0
count = (intfrmcount + 1) * 649 - 1
For i = 0 To count
Text2 = Text2 & Hex(revHead(i)) & ";"
Next
StatusBar1.Panels(1).Text = "数据接收完毕,正在将数据添加至数据库,请等待……"
…… '处理收到的数据
End Sub
4 结束语
在Text2文本框中可以看到收到的全部数据,事后可对数据进行分析,例如根据协议提取需要的数据存入后台数据库等。这种方法虽然很简便的实现了上位机接收并处理多帧数据的功能,但它仍有不足之处。例如在程序中,我们设置接收第一帧的并处理的时间为2000毫秒(即2秒钟),但如果由于网络传输原因,导致2秒钟传送不完一帧数据时,会出现丢失数据的错误,因此根据下位机的数据传输和处理的时间来很好控制Timer控件的间隔时间是关键,这方面还需改进。
参考文献:
[1] 高春艳,刘彬彬.Visual Basic控件参考大全[M]北京:人民邮电出版社,2006.12.
[2] 崔彦锋,许小荣.VB 网络与远程控制编程实例教程[M]北京:北京希望电子出版社,2002.
[3] 杨延双,张建标,王全民.TCP/IP协议分析及应用[M]北京:机械工业出版社,2006.
[4] 汪晓平.Visual Basic网络高级编程[M].北京:人民邮电出版社,2001.
收稿日期:2008-04-17
作者简介:郭毅(1979-),男,湖北黄石人,海南政法职业学院助教,研究方向为计算机应用;涂婧璐(1977-),女,江西抚州人,海南政法职业学院助教,工学硕士,研究方向为计算机通信及图形图像学。