论文部分内容阅读
摘要:简要介绍了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控件来控制处理接收数据的时间。
关键词:网络通信;多帧数据;计时器控件
中图分类号: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控件来控制处理接收数据的时间。