趙曉鳳
(蘇州工業園區工業技術學校,江蘇 蘇州215123)
在局域網中發布信息可以不依賴基于因特網開發的信息發布交流工具,這種方式很好地解決了因外網不穩定而造成信息中斷的問題,而且有很強的保密性,適合企事業單位使用。本文就如何設計開發局域網信息發布系統進行了有效的嘗試。
局域網信息發布系統開發流程如圖1所示。

圖1 局域網信息發布系統開發流程
傳輸協議有很多種,本文開發局域網信息發布系統主要應用TCP協議,通過TCP協議把本地計算機和遠程計算機進行連接。TCP協議要求必須先建立連接,然后才被允許數據傳輸。能被利用開發局域網信息發布系統的協議還有UDP協議。UDP協議的特點是在傳輸數據前,不進行連接請求而直接發送,在傳輸信息上來看這樣做很不可靠。
要實現局域網通信,VB中提供了一種方便易行的方法,那就是Winsock控件。這樣設計者就可以不必了解數據傳輸細節,非常容易地進行程序設計。
VB中Winsock控件能使用兩種協議:TCP協議及UDP協議。TCP協議能保證傳輸數據安全到達目的地,而UDP協議只是將數據傳送到網絡上,不檢查數據是否到達目的地,因此要進行安全通信控制和實時會話最好采用TCP協議。
Winsock控件有很多的屬性、方法及事件,以下是設計時可能會常使用的幾種屬性、方法和事件。
(1)屬性
Index:控件索引值
LocalHostName:本機名
LocalIP:本機IP
LocalPort:通信端口
Name:實例名
Protocol:所用協議,主要指TCP和UDP
RemoteHost:服務器名
RemoteHostIP:服務器ip
RemotePort:服務器偵聽端口
State:控件連接狀態,即連接與未連接
(2)方法
Accept():接受連接請求
Close():關閉該連接
Connect():請求與遠程計算機連接
GetData():從接收緩沖區讀取數據
Listen():偵聽連接請求
SendData():發送數據
(3)事件
Close():關閉連接時發生
Connect():建立連接時發生
ConnectionRequest():客戶端請求與服務器程序連接時發生
DataArrival():數據到達時發生Error():發生錯誤時發生
遠程計算機的連接原理:TCP協議要求必須使用服務器才能建立連接、通信,加上需要分別開發客戶端程序和服務器端程序。
2.3.1 設計客戶端程序需要明確項
(1)服務器計算機的名稱以及Ip地址,利用RemoteHost屬性調用。
(2)服務器計算機的通信端口,利用RemotePort屬性調用。
(4)服務器建立連接后,進行數據的傳送和捕捉,利用事件DataArrival和方法SendData與GetData。
2.3.2 服務器端程序的主體
(1)設置服務器的通信端口。
(2)調用偵聽,捕捉客戶機的請求,利用Listen方法。
(3)接到連接請求后,建立連接,利用Accept方法。
(4)服務器建立連接后,進行數據的捕捉和傳送,利用事件DataArrival和方法SendData與GetData。
首先設置其IP地址為:10.72.83.1,在防火墻-設置本地端口localPort設為1200(使用不常用的端口,否則會發生沖突),在服務器端程序加入一個winsock控件,名稱為changgongserver(0),這樣就可以在運行時動態地增減控件,便于與多個計算機進行對話。在主窗體Load事件中的代碼如下。
changgongserver(0).bind
changgongserver(0).LocalPort
阿什哈達摩崖石刻始刊于清德宗光緒十七年(1891)吉林將軍長順監修的《吉林通志·金石志》卷120,但文字著錄錯誤較多,不足為研究的依據。其后陸續有人親赴現地進行調查和墨拓,他們所著錄的文字,雖然基本已趨于一致,但個別地方仍略有不同。因此,1957年5月,吉林省博物館派人實地調查,并作了記錄、照相和墨拓。1972年,吉林省博物館又做了一次調查核對。
‘用于綁定端口號或者在Winsock
控件屬性中設置也可以
‘偵聽客戶機的請求
changgongserver(0).listern
3.2.1 建立連接
在客戶端程序中,添加 Winsock控件,方法是在工具欄中右擊部件,查找到對應部件選中確認即可。在Winsock控件的屬性窗口中RemoteHostIP(即服務器IP)為”10.72.83.1”,RemotePort(即服務器偵聽客戶機請求的端口)=1200。
為了傳輸信息,必須建立通信連接,客戶端必須要發出請求,實現代碼為:changgongconnect.connect changgongconnect.RemoteHost,changgongconnect.RemotePort,服務器接收到請求后,通過 ConnectRequest事件調用連接,具體代碼實現如下:
Private sub changgongserver_connectrequest(Index as Integer,Byval requestid as long)
dim simple as string//用于存儲客戶端IP
dim I as integer//
On Error GoTo ErrHandle
simple=changgongserver(0).RemoteHostIP//獲得登錄者地址信息
X=1
Do while X<=changgongserver.ubound//檢查該地址是否已存在
If changgongserver(X).RemoteHostIP=simple then//如果存在的話就不必加載新的控件
Changgongserver(X).Accept requested
Exit sub
End If
X=X+l
loop
load changgongserver(X)//加載新的控件
changgongserver(X).accept requested
End sub
3.2.2 客戶端傳送實現
首先設置在客戶端窗體程序中加入主體控件,主要有兩個:commond控件“send”和文本框控件。文本框控件的name屬性設為txt_info,即為需要傳送的信息或數據。
在 “send”控件代碼窗口中加入如下代碼:
dim userinfo as string
userinfo=txt_info.text
sckconnect.SendData userinfo
3.2.3 服務器端數據的接收
連接建立后,服務器端捕獲到客戶端發出的信息后,通過DataArrival事件調用GetData方法完成數據的接收工作,服務器端DataArrival事件代碼窗口中加入以下代碼:
Private sub changgongserver_DataArrival(Index as integer,Byval BytesTotal as long)
dim clientdata as string
‘定義字符串變量,用于接收數據
changgongserver(1).GetData clientdata,vbstring
‘服務器捕獲客戶端發出的信息,并‘把信息存入到clientdata變量中
end sub
為了讓每個用戶都可以收到,還要在服務端WINsock控件中的DataArrival事件中加入數據的轉發語句,傳送給已經與主機建立連接的所有客戶端,實現代碼如下:
For info=l to changgongserver.Count Step 1
if changgongserver(X).state=changgongClosed then‘檢測連接狀態
Else
Changgongserver(X).SendData client data ‘轉發數據
End If
next info
3.2.4 客戶端程序接收數據
在數據到達客戶端后,同時觸發客戶端的Data-Arrival事件,在該事件中仍然調用GetData方法對數據進行接收工作:
Private sub changgongserver_DataArrival(Index as integer,Byval BytesTotal as long)
dim serverdata as string定義變量,用于接收
changgongserver(1).GetData serverdata,vbstring‘存在變量中
end sub
3.2.5 程序的關閉
在關閉應用程序前,先要關閉連接,在窗體unload事件中加入如下代碼:
Private sub myform_unload(cancel as integer)
if changgongconnect.state<>0then
changgongconnect.Close()
end if
end sub
本程序僅僅利用了vb語言中Winsock控件的強大功能中的一部分,即調用TCP協議實現局域網的相互通信。要實現功能更強、更完備的通信系統,獲得良好的兼容性與容錯性,還需要深入地研究。