?

VB網絡通信中多幀數據接收的簡易方法

2008-07-14 10:05涂婧璐
電腦知識與技術 2008年18期
關鍵詞:網絡通信

郭 毅 涂婧璐

摘要:簡要介紹了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-),女,江西撫州人,海南政法職業學院助教,工學碩士,研究方向為計算機通信及圖形圖像學。

猜你喜歡
網絡通信
基于NoC架構的網絡通信抗干擾方法研究
基于網絡通信的智能照明系統設計
基于CAN總線的網絡通信信道的建模與研究
移動計算機網絡通信技術研究
遠程網絡通信中安全監測平臺設計
計算機網絡通信常見問題與技術發展研究
網絡通信中信息隱藏技術的應用
基于網絡通信的校園智能音箱設計
談計算機網絡通信常見問題及技術發展
汽車檢測控制系統網絡通信技術分析
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合