国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

VB6實現局域網多站點互連手冊

2019-11-18 17:41:16
字體:
來源:轉載
供稿:網友
這里對Winsock控件的屬性、方法和事件的介紹限于篇幅就不介紹了,下面以最簡單的C/S模式下一臺服務器和一臺客戶機的連接來說明其整個連接過程。

  用框圖表示如圖1所示。首先運行服務器端的程序,使TcpServer處于監聽狀態,然后運行客戶機端的程序,單擊【連接服務器】按鈕后,客戶機端調用Connect方法呼叫服務器(根據RemoteHostient,TcpServer(0)用來對客戶機進行監聽,TcpServer(2)和TcpServer(3)是動態加載用來接受相應的客戶機的請求來建立連接的。而TcpClient(2)和TcpClient(3)不是動態加載的,而是在Form_Load初始化過程中加載,用來呼叫相應的服務器。

  這樣也是可以實現多機互連的,不過也有些問題。如果1號機作為客戶機呼叫2號機并已經收到2號機的響應建立了一條通訊鏈路,這時1號機又作為服務器接收到2號機的呼叫請求,并且也建立了一條通訊鏈路。這樣二臺機之間建立了兩條鏈路,理論上兩臺機只要有一條鏈路就可以正常通訊,現在建立了兩條鏈路,收發數據是否正常呢?通過測試,收發數據不會出錯:當1號機給2號機發數據時,是通過1號機的TcpServer(2)或TcpClient(2)發送數據給2號機,而2號機是通過其TcpClient(1)或TcpServer(1)接收1號機的數據,雙方兩條鏈路互不干擾。不過這種方案還是不太可取,因為加載控件需要占用內存資源,每兩臺機之間其實只需一條鏈路就能正常通訊,現在又多了條鏈路,這對系統有限的資源是極大的浪費。

  方案三:三臺機有差互連

  先解釋一下什么叫有差互連。具體做法是:1號機只作為服務器監聽2號和3號機的呼叫請求而不呼叫它們;2號機既是客戶機又是服務器:作為客戶機只呼叫1號機,而作為服務器監聽3號機的呼叫請求;3號機只作為客戶機對1號機和2號機進行呼叫,而不具備服務器監聽的功能。所以說這幾臺機的連接是有差的,這種連接方式不會在兩臺機之間建立兩條鏈路,因為網絡中任意兩臺機只有一臺可以呼叫對方或監聽對方的呼叫請求,這樣無論如何都不會產生兩條通訊鏈路,節省了系統資源,又滿足了局域網中任意兩臺機互連的要求,由此看來這個方案是最優方案。

  下面介紹方案三的實現過程。

  1號機

  1號機的窗體(Form)上放置兩個Winsock控件,一個名為TcpLsn,負責監聽2號機和3號機的呼叫請求,另外一個為TcpConn,這是個控件數組,Index為2,即已經加載了TcpConn(2),這個控件是為了和2號機建立連接。在初始化過程中(Form_Load)設置服務器的監聽端口號(TcpLsn.LocalPort)并使其處于監聽狀態(TcpLsn.Listen),并置與客戶機連接成功的標志(TcpConnected數組,布爾型常量)為False。當TcpLsn監聽到某個客戶機的呼叫請求后(具體是哪個客戶機是根據客戶機IP地址判斷),在TcpLsn的ConnectionRequest事件中動態加載TcpConn控件并調用Accept方法接受客戶機的請求,與其建立連接(如果客戶機是2號機,則無需再加載控件,因為在Form_Load中已經加載過了)。要注意的是,TcpLsn只是用來監聽客戶機的呼叫請求,而不是用來與客戶機建立連接的,TcpConn控件數組才是與客戶機建立連接的。當某一客戶機斷開連接時,會觸發Tcpconn控件數組的Close事件,在這里可以根據客戶機的IP地址來調用Close方法關閉與其相連的Tcpconn控件,并動態卸載之。同樣TcpConn(2)不能卸載,因為其不是動態加載的。

  2號機

  2號機窗體(Form)上也放置兩個Winsock控件,一個名為TcpLsn,負責監聽3號機的呼叫請求,另外一個為TcpConn,這是個控件數組,Index為1,即已經加載了TcpConn(1),這個控件是為了與1號機建立連接。在初始化過程中(Form_Load)同樣要設置2號機作為服務器的監聽端口號,然后使其處于監聽狀態,還要設置與其他幾個站點連接成功的標志:TcpConnected(數組)。2號機作為服務器監聽的過程同上,而呼叫1號機是通過VB6的定時器(Timer)實現的,定時器的作用是每隔一段時間(可自行設定間隔事件)觸發Timer事件,即執行Timer事件中的代碼,利用這個原理就可以實現一運行此程序就自動進行呼叫工作,首先將定時器間隔時間定為1000毫秒(定時器命名為TimConn,TimConn.Interval=1000),然后在定時時間到事件中(TimConn_Timer)調用TcpConn的Connect方法呼叫1號機,當然要加一個判斷:當TcpConnected(1)=False且TcpConn(1).State=sckClosed時才進行呼叫。

  在客戶機調用了TcpConn方法后,其連接狀態是sckConnecting(正在連接服務器,值為6)。如果此時1號機在一段時間內(連接服務器超時時間)沒有接受請求或者根本沒有開啟,那么就會觸發連接錯誤事件(TcpConn_Error),這時連接狀態是sckError(連接錯誤,值為9),就無法再進行連接服務器的工作了,如果1號機此時打開,客戶機也不會再呼叫服務器了。要解決這個問題,可以在TcpConn的錯誤事件中(TcpConn_Error)加上一條語句:TcpConn(Index).Close即在錯誤事件中關閉當前的連接,使當前TcpConn控件狀態處于sckClosed,這樣在下一次的定時時間到事件中客戶機又能呼叫1號機了。呼叫1號機成功后,不要忘記在TcpConn的Connect事件中置連接1號機成功的標志位。同樣要注意關閉事件中不能卸載TcpConn(1)。

  3號機

  3號機在所有站點中只呼叫1號機和2號機。所以只要一個Winsock控件數組即可,命名為TcpClient,Index=1。在程序初始化過程中,加載呼叫服務器的所有Winsock控件:LoadTcpClient(2)
TcpClient(1)已經放在窗體中了,故不必重復加載。還要設置連接成功的標志位(TcpConnected數組為False),并設置定時器間隔時間。然后在定時時間到事件中調用TcpClient的Connect方法連接服務器,這與2號機作為客戶機呼叫服務器的過程類似,同樣要在TcpClient的連接錯誤事件中添加以下語句:TcpClient(Index).Close。要注意的是在服務器的斷開連接觸發的客戶機關閉事件中(TcpClient_Close)只需要置標志位,而不能卸載TcpClient控件數組,因為其不是動態加載的。

  到此為止,基本上實現了運行此程序即進行多機互連的功能。

  典型問題解析

  1.各個站點建立連接后關閉3號機的程序,在其它的站點就會彈出對象已加載的錯誤提示。出現這個錯誤的可能原因是Winsock控件已經加載,而后又執行了一次加載動作。不過實驗證明不是此Winsock控件被重復加載。在微軟公司的官方網站,VB6最新的ServicePack5補丁(SP5)的說明文檔中有這樣一條很重要的修正說明:重復加載或卸載Winsock控件會引起內存泄露。這一修正是不是可以針對用Winsock控件實現網絡連接及通訊的程序呢?理論實踐證明了這一猜測的真實性。下載完SP5并成功安裝后,將程序原封不動運行一遍,“對象已加載”的錯誤窗口就再沒出現過,這個問題也就成功的解決了。

  2.由于設置了客戶機的本地端口號(LocalPort),導致必須先關閉服務器再關閉客戶機才能在下一次正常連接以及客戶機異常退出時(比如客戶機突然停電)導致下次無法正常連接。這是由于沒有釋放連接端口號造成的。這個錯誤的解決方法是不要設置客戶機的本地端口號;如果非得設置,那么可以利用動態改變服務器監聽端口號和客戶機呼叫端口號的方法。具體做法是在服務器的Form_Load中改變監聽端口號,在客戶機的Winsock控件錯誤事件中改變呼叫端口號,端口號只要用兩個就可以了(如1000和1001)。->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 如东县| 康马县| 正阳县| 博湖县| 龙南县| 桃源县| 宁城县| 湖南省| 祁门县| 孟州市| 徐闻县| 治县。| 汉寿县| 乌拉特中旗| 永昌县| 安岳县| 沁阳市| 碌曲县| 宁南县| 遵化市| 临沭县| 建水县| 手机| 灵川县| 台南县| 正镶白旗| 山东省| 厦门市| 清流县| 绥芬河市| 娄底市| 梓潼县| 濉溪县| 凤山县| 南昌市| 新竹县| 云霄县| 嘉黎县| 略阳县| 普洱| 汉阴县|