




免費預覽已結束,剩余9頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
現在大多數語言都支持客戶服務器模式編程,其中VB給我們提供了很好的客戶服務器編程方式。下面我們用VB來實現TCPIP網絡編程。TCPIP協(xié)議是Internet最重要的協(xié)議。VB提供了WinSock控件,用于在TCPIP的基礎上進行網絡通信。當兩個應用程序使用Socket進行網絡通信時,其中一個必須創(chuàng)建Socket服務器偵聽,而另一個必須創(chuàng)建Socket客戶去連接服務器。這樣兩個程序就可以進行通信了。1創(chuàng)建服務器,首先創(chuàng)建一個服務端口號。并開始偵聽是否有客戶請求連接。建立一窗體,并向其增加一個Winsock控件(可在工程菜單中的部件項來添加此控件),添加兩文本框Text1,Text2,和一按鈕Command1。Private Sub Form_Load()SockServer.LocalPort = 2000 服務器端口號,最好大于1000SockServer.Listen 開始偵聽End SubPrivate Sub Form_Unload(Cancel As Integer)SockServer.CloseEnd SubPrivate Sub SockServer_Close()SockServer.CloseEnd SubPrivate Sub SockServer_ConnectionRequest(ByVal requestID As Long)SockServer.CloseSockServer.Accept requestID 表示客戶請求連接的ID號End Sub當客戶向服務器發(fā)送數據到達后,產生DataArrival事件,在事件中接收數據,GetData方法接收數據。Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockServer.GetData sText1.Text = sEnd Sub當我需要向客戶發(fā)送數據時,只需調用SendData方法。Private Sub Command1_Click()SockServer .SendData Text2.TextEnd Sub2創(chuàng)建客戶。要創(chuàng)建客戶連接服務器,首先設置服務器主機名,如IP地址、域名或計算機名,然后設置服務器端口,最后連接服務器。建立一窗體,并向其增加一個Winsock控件(可在工程菜單中的部件項來添加此控件),取名為:SockC1。添加兩文本框Text1,Text2,和一按鈕Command1。Private Sub Form_Load()SockCl.RemoteHost =表示服務器主機名SockCl.RemotePort = 2000 表示服務器端口名SockCl.Connect連接到服務器End SubPrivate Sub Form_Unload(Cancel As Integer)SockCl.CloseEnd SubPrivate Sub SockCl_Close()SockCl.CloseEnd SubPrivate Sub SockCl_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockCl.GetData s 接收數據到文本框中Text1.Text = sEnd SubPrivate Sub Command1_Click()SockCl.SendData Text2.Text 向服務器發(fā)送數據End Sub3進行通信。把這兩個窗體分別編譯成兩個EXE文件,服務器Server.exe和客戶Client.exe 程序,并把它們分別安裝在服務器端和客戶端,這樣就可以實現兩者通信了。VB Socket編程(Winsock控件創(chuàng)建TCP/IP客戶機/服務器程序)Winsock控件建立在TCP、UDP協(xié)議的基礎上,完成與遠程計算機的通信。即使對TCP/IP不太熟悉的用戶,使用該控件也可以在十幾分鐘內創(chuàng)建一 個簡單的客戶機/服務器程序。下面我們對Winsock控件的事件、方法、屬性按其在程序中出現的順序分別作詳細的介紹,以便更好地理解程序源代碼。 下面是Winsock控件的相關屬性,方法和事件。(略去一些暫用不到的) *屬性 - LocalHostName | 本地機器名 LocalIP | 本地機器IP地址 LocalPort | 本地機器通信程序的端口(0 端口 65536) RemoteHost | 遠程機器名 RemotePort | 遠程機器的通信程序端口 state | 連接的當前狀態(tài)(文后有詳細說明) Protocal | 使用TCP或UDP協(xié)議(這里我們選0-sckTCPProtocal) - *方法 - Listen Listen方法用于服務器程序,等待客戶訪問。 格式:Winsock對象.listen Connect Connect方法用于向遠程主機發(fā)出連接請求 格式:Winsock對象.connect 遠程主機IP,遠程端口 Accept Accept方法用于接受一個連接請求 格式:Winsock對象.accept Request ID Senddata 此方法用于發(fā)送數據 格式:Winsock對象.senddata 數據 Getdata 用來取得接收到的數據 格式:Winsock對象.getdata 變量 ,數據類型 ,最大長度 Close 關閉當前連接 格式:Winsock對象.close *事件 - Close | 遠程機器關閉連接時觸發(fā) Connect | 連接建立好,可以進行通信時觸發(fā)(客戶端) ConnectRequest | 有請求連接到達時產生(服務器端) DataArrival | 有數據到達時觸發(fā) Error | 發(fā)生錯誤時發(fā)生 SendProgress | 數據傳送進度 - 服務器程序的實現過程是: (1)服務器程序必須設置好LocalPort屬性,作為偵聽端口,該值為一個整數(只要是一個其它TCP/IP應用程序沒有使用過的值即可)。 (2)使用Listen方法進入偵聽狀態(tài),等待客戶機程序的連接請求。 (3)客戶機程序發(fā)出連接請求,使服務器程序產生ConnectionRequest事件,該事件得到一個參數requestID。 (4)服務器程序用Accept方法接受客戶機程序的requestID請求。這樣,服務器程序就可以用SendData方法發(fā)送數據了。Accept方法必須用上一步得到的requestID作為其參數。 (5)當服務器程序接收到數據時,產生DataArrival事件,參數BytesTotal包含接收到的數據字節(jié)數。在該事件中,可以用GetData方法接收數據。 (6)如果接受到Close事件,則用Close方法關閉TCP/IP連接。 客戶機程序的實現過程是: (1) 客戶程序設置Remotehost屬性,以便指定運行服務器程序的主機 名,該字符串可在“控制面板|網絡|標識|計算機名”中查到。 (2) 設置RemotePort屬性,以便指定服務器程序的偵聽端口。 (3)使用Connect方法,向服務器提出連接請求。 (4)服務器接受客戶機程序的請求,客戶機程序產生Connect事件,就可以用SendData方法發(fā)送數據了。 (5)當客戶機程序接收到數據時,產生DataArrival事件,參數BytesTotal包含接收到的數據字節(jié)數。在該事件中,可以用GetData方法接收數據。 (6)如果接受到Close事件,則用Close方法關閉連接。 Winsock控件還有兩個重要的屬性,即Protocol和State。Protocol設定使用的協(xié)議是TCP還是UDP:取值 sckTCPProtocol表示TCP, 取值sckUDPProtocol則表示UDP。因為Winsock控件的缺省設置是sckTCPProtocol,所以程序中并沒有使用 Protocol屬性。State屬性反映的是當前TCP/IP的連接狀態(tài),取值如表1所示。 表1 Winsock控件的State屬性及其描述 常數 值 描述 SckClosed 0 缺省值,關閉 SckOpen 1 打開 SckListening 2 偵聽 SckConnectionPending 3 連接掛起 SckResolvingHost 4 識別主機SckHostResolved 5 已識別主機 SckConnecting 6 正在連接 SckConnected 7 已連接 SckClosing 8 同級人員正在關閉連接 SckError 9 錯誤 先在一臺計算機上運行服務器程序,此時窗口上只有一個“退出”按鈕。 再在另一臺計算機上運行客戶機程序,在“連接”按鈕右邊的文本框中輸入服務器的主機名后單擊“連接”按鈕。如果連接成功,則服務器和客戶機程序窗口都會出 現兩個文本框。這時,兩端都可以在上面的文本框中輸入文字,這些文字會立即在下面的文本框中出現。 服務器程序使用的控件如下: (1)Command1:退出按鈕; (2)textsend:發(fā)送數據文本框; (3)Winsockserver: 服務器Winsock; (4)textget :接收數據文本框。 服務器程序的界面如圖所示。 服務器程序的源代碼如下: Private Sub Command1_Click() End End Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockserver.LocalPort = 1001 Winsockserver.Listen End Sub Private Sub textsend_Change() Winsockserver.SendData textsend.Text End Sub Private Sub Winsockserver_Close() Winsockserver.Close End End SubPrivate Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) textsend.Visible = True textget.Visible = True If Winsockserver.State sckClosed Then Winsockserver.Close Winsockserver.Accept requestID End Sub Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As StringWinsockserver.GetData tmpstr textget.Text = tmpstr End Sub 客戶機程序使用的控件如下: (1)Command1:退出按鈕; (2)Command2:連接按鈕; (3)Winsockclient:客戶Winsock; (4)Text1:主機名文本框; (5)Textsend:發(fā)送數據文本框; (6)Textget:接收數據文本框; 客戶機程序的源代碼如下: Private Sub Command1_Click() End End Sub Private Sub Command2_Click() Winsockclient.Connect End Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockclient.RemotePort = 1001 Winsockclient.RemoteHost = sccdsz End Sub Private Sub Text1_Change() Winsockclient.RemoteHost = Text1.Text End Sub Private Sub textsend_Change() Winsockclient.SendData textsend.Text End Sub Private Sub Winsockclient_Close() Winsockclient.Close End End Sub Private Sub winsockclient_Connect() textsend.Visible = True textget.Visible = True Command2.Visible = False End Sub Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockclient.GetData tmpstr textget.Text = tmpstr End Sub1 引言 隨著網絡通信的興起與迅速發(fā)展,TCP/IP協(xié)議已成為計算機網絡中最主要的傳輸協(xié)議,TCP/IP傳輸協(xié)議也越來越為人所熟知。目前的Internet 網就是基于TCP/IP協(xié)議的互聯(lián)網絡。TCP/IP除了用于廣域外,在局域網中也廣泛應用。 TCP是傳輸控制協(xié)議,它提供了一種可靠的、面向會話連接的數據流服務,它可以在一個分組可能發(fā)生丟失、破壞、重復、延遲和亂序的不可靠物理網絡之上通過確認、流控、復用同步等自動糾錯技術提供一種可靠的進程間通信機制,從而充分保證用戶數據傳送的可靠和有序性。使用TCP協(xié)議通信時,TCP建立并控制數據發(fā)送方與接收方的會話關系,當接收方正確收到數據后,必須向發(fā)送方發(fā)送確認信息。如果發(fā)送方在指定時間內未能收到確認信息,將重發(fā)數據包。 IP指分組交換協(xié)議,是聯(lián)網的主機之間定義數據包傳送路由的規(guī)則,它的基本任務是通過網絡傳送數據報,各個IP數據報之間是相互獨立的。IP本身沒有連接協(xié)議,在交換數據前不會建立會話關系。IP收到數據后也不確認,發(fā)送方和接收方都不檢測數據傳輸的正確性。所以僅有IP是不可靠的,不能確保正確傳輸數據。TCP與IP的組合則構成了功能完整的傳輸協(xié)議。 在TCP/IP網絡應用中,多數網絡應用程序是使用客戶/服務器模型方式,客戶向服務器發(fā)出服務請求,服務器作出應答響應,服務器通常在一個眾所周知的地址偵聽客戶向服務器發(fā)出的請求,服務進程這時一直是處于休眠狀態(tài),直到有一個客戶程序提出連接請求。服務器作出應答,并為客戶提供相應的服務??蛻?服務器模型最重要的特點是非對等相互作用,客戶與服務器處于不平等的地位。服務器擁有客戶機所不具備的各種軟硬件資源和運算處理能力,服務器提供服務,客戶請求服務,這種模式適應了網絡資源、運算能力、信息分布不均等現象,成為IP應用的主要模式。Internet中的WWW、FTP、Telnet、E-mail等許多典型應用都是采用客戶/服務器模型方式。 Visual Basic是Windows環(huán)境下簡單、易學、高效的可視化編程語言開發(fā)系統(tǒng),以其所見即所得的可視化界面設計風格和32位面向對象的程序設計等特點,已廣泛地應用于各個領域,是很多計算機軟件開發(fā)人員采用的開發(fā)工具。VB不但提供了良好的界面設計能力,而且在網絡通信方面的功能也很強。采用VB開發(fā)網絡通信應用軟件十分方便,尤其軟件界面設計非常便捷,編程工作量較小,開發(fā)周期短。 Visual Basic6.0中提供了Winsock控件,用于支持網絡中兩臺以上計算機之間進行通信。Winsock控件提供了多樣化的屬性和方法來實現網絡通信。通過設置Winsock控件屬性及調用控件方法就能夠實現TCP或UDP方式的網絡通信。因此,使用Winsock控件編寫網絡通信程序的過程,實際上就是設置Winsock控件屬性和調用控件方法的過程。利用這個控件,編程人員可以輕松地編寫出TCP/IP客戶服務器程序。 2 Winsock控件 Winsock控件是不可視控件,它提供了訪問TCP和UDP網絡服務非常簡便的途徑,使編程人員開發(fā)客戶/服務器應用程序時,不必了解TCP的細節(jié)或調用低級的WinsockAPIs函數,只通過設置Winsock控件的屬性并調用其方法,就可直接連接到一臺遠程計算機進行,并可實現雙向數據交換。Microsoft Access、Visual Baisc、Visual C+或Visual FoxPro都可用其編寫客戶服務器程序。 如果訪問TCP傳輸控制協(xié)議服務功能,則須建立連接并實現主機間點對點通信。如果訪問UDP數據文報協(xié)議功能,則不建立連接,發(fā)送數據將以廣播方式上網傳輸。 3 TCP/IP客戶服務器程序設計方法 使用TCP/IP協(xié)議通訊,首先要指定通信方式為TCP方式,將Winsock控件的Protocol屬性設置為sckTCPProtocol.然后,按TCP通信協(xié)議規(guī)定,先要申請建立網絡連接,然后才能傳輸數據。 3.1服務器程序開始偵聽網絡 服務器程序窗體中有三個Winsock控件,Name分別為sckServer、sckBusy和sckListen. 其中sckListen是偵聽控件;sckBusy是;sckServer連接控件。偵聽控件和連接控件不能是同一個Winsock控件。 服務器程序必須首先偵聽網絡,等待客戶的連接申請,才有可能建立網絡連接。服務器程序開始偵聽網絡前,需要為偵聽用(sckListen)控件的LocalPort屬性設置通信接口,然后調用Listen方法。服務器程序開始偵聽網絡的程序代碼如下: sckListen.LocalPort=4477 sckListen.Listen 偵聽網絡 3.2客戶程序申請連接 當服務器程序已經啟動運行并開始偵聽網絡后,在客戶程序申請連接前,需要為客戶Winsock控件的RemodeHost屬性設置遠程主機,為RemodePort屬性設置通信接口,然后再調用Connect方法向服務器程序申請連接。 設置遠程主機名,可以是計算機名也可是IP地址。如果是主機計算機名,則需要系統(tǒng)翻譯為相應的IP地址;如果是主機IP地址,則直接進行連接。 申請連接的程序代碼如下:sckClient.Protocol = sckTCPProtocol 設置協(xié)議為TCP方式IP地址代表本機,與本機的實際地址無關sckClient.RemoteHost = 設置遠程主機接口號,該值必須與設置遠程主機服務器程序的接口號一致sckClient.RemotePort = 4477sckClient.Connect 申請連接 3.3服務器程序應答連接請求 服務器程序啟動偵聽網絡后,當客戶程序執(zhí)行Connect方法申請連接時,服務器程序的偵聽控件(sckListen)觸發(fā)ConnectionRequest事件,并傳遞連接請求句柄。編程人員需要在該當事件程序中調用連接控件(sckServer)的Accept方法實現連接。 服務器程序應答連接的程序代碼如下:Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)sckServer.Accept requestID 應答連接請求End Sub 當服務器程序執(zhí)行Accept方法建立連接后,客戶程序中的接連控件將觸發(fā)Connect事件通報連接完成,否則觸發(fā)Error事件通報連接失敗??梢栽谠撌录绦蛑屑尤脒B接后的處理程序。 如果要求服務器程序支持多用戶連接,則需要創(chuàng)建Winsock控件數組,在連接時動態(tài)生成Winsock控件與客戶程序建立連接。程序代碼應修改如下:Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)Dim i As LongIf CurNumberMaxNumber Then MaxNumber為最大連接數,CurNumber為當前連接數For i = 1 To CurNumberIf sckServer(i).State = 0 Then 判斷是否有空閑Winsock控件Exit ForEnd IfNext iIf i = CurNumber ThenCurNumber = CurNumber + 1i = CurNumberEnd IfLoad sckServer(i) 動態(tài)加載Winsock控件sckServer(i).Accept requestIDExit SubEnd IfsckBusy.ClosesckBusy.Accept requestIDEnd Sub 3.4傳送數據 當服務器程序和客戶程序連接成功后,可以開始傳送數據。建立連接后的服務器程序和客戶程序都可以發(fā)送或接收數據。當一方要發(fā)送數據時,調用SendData方法。Dim SendStr As StringSendStr = 連接成功!Winsock1.SendData SendStr 傳送數據 如果一方發(fā)送了數據,在連接的另一方控件將產生DataArrival事件,在DataArrival事件處理程序中需要調用GetData方法接收數據。接收數據類型必須與發(fā)送數據的類型一致方可正確接收數據。接收數據的程序代碼如下:Dim RecStr As StringsckClient.GetData RecStrPrint RecStr 3.5關閉連接 當應用程序結束數據傳送后,必須關閉連接,釋放系統(tǒng)資源。當連接的一方關閉連接時,可以調用Close方法。關閉連接程序代碼如下: sckClient.Close 關閉連接 一方執(zhí)行關閉連接后,在連接的另一方控件將產生Close事件。程序需要處理事件,完成關閉連接的最后工作。該事件的處理代碼如下:Private Sub sckServer_Close()sckServer(Index).Close 釋放接連Unload sckServer(Index) 刪除控件End Sub 4 使用UDP通信方式程序設計方法 UDP用戶報文協(xié)議是一個無連接協(xié)議,與TCP協(xié)議操作不同,UDP協(xié)議不使用報文確認機制,不對報文排序,不進行流控,因而UDP報文可能出現丟失、重復、亂序等現象,但由于它的前期工作比TCP少,計算機不建立連接,因而可以迅速地展開通信,一般用于傳輸少量不重要的數據和信息。Winsock控件的UDP通信方式是一種廣播方式,當UDP主機發(fā)送數據時,網絡上所有其它主機都能收到數據,UDP通信比TCP方式簡單,由于UDP不需要連接,所以沒有申請連接和關閉連接的過程。UDP發(fā)送者忽略接收者是否實際收到數據,而接收者也忽略發(fā)送者是否已發(fā)送了數據。這使編寫UDP通信方式的網絡程序非常簡單。 4.1 設置服務器程序中Winsock控件的屬性 在服務器程序中,需要為Winsock控件的LocalPort屬性設置通信接口:sckserver.LocalPort=4477 4.2 客戶程序發(fā)送數據 當UDP主機要發(fā)送數據時,可調用SendData方法。發(fā)送數據程序的代碼如下:Dim SendStr As StringSendStr = 發(fā)送信息!sckClient.SendData SendStr 傳送數據vb映射已知服務器的方法VB 設定/取消 網絡磁盤使用方法: 建立連線 Function AddConnection(ByVal RemoteLocation As String, _ ByVal LocalDriver As String, _ ByVal Passwd As String, _ ByVal UserName As String) As Boolean RemoteLocation : 為網絡磁盤原始來源,格式為 RemoteComputerShareDirectory LocalDriver : 對應本機的磁盤代號,如: H: Passwd : 存取網絡磁盤的Password,傳Null表示不用密碼 UserName : 存取網絡磁盤的使用者代號 成功時傳回True,否則為False 例: Call AddConnection(Shihcmias, x:, vbNullString, cww) 取消連線 Function CancelConnection(ByVal LocalDriver As String, _ ByVal ForceClose As Boolean) As Boolean LocalDriver : 對應本機的磁盤代號,如: H: ForceClose : True表示強迫結束連線,而不管有沒有程式正與之連線 成功時傳回True,否則為False 例: Call CancelConnection(x:, True) 以下在.bas Option Explicit Type NETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment As String lpProvider As String End Type Declare Function WNetAddConnection2 Lib mpr.dll Alias WNetAddConnection2A (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long Declare Function WNetCancelConnection2 Lib mpr.dll Alias WNetCancelConnection2A (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long Declare Function WNetGetLastError Lib mpr.dll Alias WNetGetLastErrorA (lpError As Long, ByVal lpErrorBuf As String, ByVal nErrorBufSize As Long, ByVal lpNameBuf As String, ByVal nNameBufSize As Long) As Long Public Const RESOURCE_PUBLICNET = &H2 Public Const RESOURCETYPE_ANY = &H0 Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0 Public Const RESOURCEUSAGE_CONNECTABLE = &H1 Public Const CONNECT_UPDATE_PROFILE = &H1 Public Function AddConnection(ByVal RemoteLocation As String,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京市海淀區(qū)清華附中2019-2020學年高三年級上冊(10月)月考生物試卷(含詳解)
- 畢節(jié)輔警招聘考試真題2023
- 湖南省長沙市一中開福中學2025年化學高二下期末聯(lián)考試題含解析
- 海南省八校聯(lián)盟2025屆高一化學第二學期期末聯(lián)考模擬試題含解析
- 浙江省S9聯(lián)盟2024-2025學年高一下學期4月期中聯(lián)考政治試題
- 河北省承德市平泉市2023-2024學年七年級下學期期末考試道德與法治試卷(含答案)
- 工地應急演練活動方案
- 工會戶內活動方案
- 展覽延伸教育活動方案
- 師德論壇活動方案
- 計量經濟學論文eviews
- 優(yōu)生優(yōu)育課件-提高生育健康水平
- 《納稅籌劃(第7版)》課件 第7章 其他稅種的納稅籌劃
- 兒童被忽視量表(CNS)
- 閩教版小學英語四年級下冊總復習
- 美制螺紋對照表
- B站營銷生態(tài)與效果向營銷資源組合【嗶哩嗶哩】【通案】【互聯(lián)網】【社交媒體營銷】
- 應收賬款-財產權信托合同
- 父母與高中生之間的協(xié)議書
- 2022年韶關市法院系統(tǒng)招聘考試真題
- 2022年江蘇省射陽中等專業(yè)學校工作人員招聘考試真題
評論
0/150
提交評論