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