用VB5 Winsock控制元件建立TCP/IP通訊程式

ljm0211發表於2012-06-28

  隨著Windows 95中文版和Windows NT Server 4.0中文版的流行, Microsoft公司推出了相應平臺上的開發軟體: Visual Basic 5.0 中文企業 版。它為Windows環境下的網路開發提供了強大的工具,Winsock控制元件就是其中之一。

  Winsock控制元件建立在TCP、UDP協議的基礎上,完 成與遠端計算機的通訊。即使對TCP/IP不太熟悉的使用者,使用該控制元件也可以在十幾分鍾內建立一個簡單的客戶機/伺服器程式。下面我們對Winsock控 件的事件、方法、屬性按其在程式中出現的順序分別作詳細的介紹,以便更好地理解程式原始碼。

  伺服器程式的實現過程是:

  (1)伺服器程式必須設定好LocalPort屬性,作為偵聽埠,該值為一個整數(只要是一個其它TCP/IP應用程式沒有使用過的值即可)。

  (2)使用Listen方法進入偵聽狀態,等待客戶機程式的連線請求。

  (3)客戶機程式發出連線請求,使伺服器程式產生ConnectionRequest事件,該事件得到一個引數requestID。

  (4)伺服器程式用Accept方法接受客戶機程式的requestID請求。這樣,伺服器程式就可以用SendData方法傳送資料了。Accept方法必須用上一步得到的requestID作為其引數。

  (5)當伺服器程式接收到資料時,產生DataArrival事件,引數BytesTotal包含接收到的資料位元組數。在該事件中,可以用GetData方法接收資料。

  (6)如果接受到Close事件,則用Close方法關閉TCP/IP連線。

  客戶機程式的實現過程是:

  (1) 客戶程式設定Remotehost屬性,以便指定執行伺服器程式的主機 名,該字串可在“控制皮膚|網路|標識|計算機名”中查到。

  (2) 設定RemotePort屬性,以便指定伺服器程式的偵聽埠。

  (3)使用Connect方法,向伺服器提出連線請求。

  (4)伺服器接受客戶機程式的請求,客戶機程式產生Connect事件,就可以用SendData方法傳送資料了。

  (5)當客戶機程式接收到資料時,產生DataArrival事件,引數BytesTotal包含接收到的資料位元組數。在該事件中,可以用GetData方法接收資料。

  (6)如果接受到Close事件,則用Close方法關閉連線。

  Winsock控制元件還有兩個重要的屬性,即 Protocol和State。Protocol設定使用的協議是TCP還是UDP:取值sckTCPProtocol表示TCP, 取值sckUDPProtocol則表示UDP。因為Winsock控制元件的預設設定是sckTCPProtocol,所以程式中並沒有使用 Protocol屬性。State屬性反映的是當前TCP/IP的連線狀態,取值如表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:傳送資料文字框;

  (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 Sub

  

  Private 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 String

   Winsockserver.GetData tmpstr

   textget.Text = tmpstr

  End Sub

  客戶機程式使用的控制元件如下:

  (1)Command1:退出按鈕;

  (2)Command2:連線按鈕;

  (3)Winsockclient:客戶Winsock;

  (4)Text1:主機名文字框;

  (5)Textsend:傳送資料文字框;

  (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 Sub

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章