Winsock Terminal示例程序
發表于:2007-07-14來源:作者:點擊數:
標簽:
請注意如果你是用 VB 6,在裝載此工程之前,請先安裝ThreeD32.OCX。該文件可在VB6的安裝盤中的common\tools\ vb \controls目錄中找到,同時在這個目錄中還有一個Vbctrl.reg文件。將這兩個文件拷貝到 windows \system目錄下,用regsvr32注冊后,運行Vbctrl已
請注意如果你是用
VB6,在裝載此工程之前,請先安裝ThreeD32.OCX。該文件可在VB6的安裝盤中的common\tools\
vb\controls目錄中找到,同時在這個目錄中還有一個Vbctrl.reg文件。將這兩個文件拷貝到
windows\system目錄下,用regsvr32注冊后,運行Vbctrl已獲取該控件的設計許可證。另外還要注意的是,源程序的注釋部分很多是亂碼,至少在我的機上如此。不過不影響程序運行。
本示例程序允許你通過選擇通信協議同遠程
服務器連接。通過該程序你可以使用幾乎所有的Inte
.net服務,例如收發電子郵件,FTP等。一旦建立連接后,你就可以向服務器發送命令并接收來自服務器的回應了。該程序的工作方式有點象DOS操作。本程序并不是一個有完全功能的程序,因此它對最終用戶來講一點用也沒有。它的目的是讓你明白
網絡協議的基本原則,一旦你了解了兩臺計算機是如何通過Internet連接的話,對于快速
開發Internet程序來說唯一的障礙就是缺乏足夠的VB編程
知識了。其實Internet編程最核心的東西就是字符串的處理。無論你選擇哪種網絡協議實際上都是在收發字符串。下圖是本程序的工作界面。
Winsock Terminal是一個小巧且易于明白的應用程序。我們可以把我們要做的事分為六步:
用戶界面開發。
建立同遠程計算機的聯系
編寫代碼,處理接收到消息
編寫代碼,處理用戶輸入的命令并發送給遠程計算機
關閉與遠程計算機的連接
開發服務子程序
用戶界面開發
本程序用到兩個窗體,除上面你所見到的外,還有一個名為frmConnect的窗體,如下圖。用戶可在該窗體中輸入服務器的地址并選擇所需的網絡協議。程序的主窗體(如上圖)包含三個部份:工具欄、狀態欄和工作區。前兩個分別用到了ToolBar和StatusBar這兩個控件,而工作區則是由一文本框控件組成的。當同遠程計算機建立了連接后,工具欄的右邊會顯示發出及接收的字節數。
狀態欄中顯示的信息表明Winsock控件當前的工作情況。另外為了能使工作區的大小隨窗體大小的改變而改變,我們須將下面的代碼放在窗體的Resize事件中。
Private Sub Form_Resize()
On Error Resume Next
With Me
txtCommand.Move .ScaleLeft, _
.ScaleTop + ToolBar.Height, _
.ScaleWidth, .ScaleHeight - _
ToolBar.Height - StatusBar.Height
End With
End Sub
建立與服務器的連接
為建立與服務器的連接,用戶必須首先單擊“連接”按鈕,此時會彈出一個“連接到...”對話框。在遠程服務器地址欄中輸入要連接的服務器的地址,并選擇網絡協議(換句話說你是在選擇要連接的端口)。該窗體另外還定義了兩個屬性,一個是port屬性,另一個是RemoteHost屬性,這兩個屬性用來接收你在文本框中輸入的端口及服務器地址,并傳遞給Winsock控件。將下面的代碼放在主窗體的“連接”按鈕的Click事件中。
Private Sub cmdConnect_Click()
Dim frm As New frmConnect
frm.Show vbModal
If cmdConnect.Tag = "Connect" Then
If Not wsCommand.State = sckClosed Then
wsCommand.Close
Do Until wsCommand.State = sckClosed
DoEvents
Loop
End If
StatusBar.Caption = ""
wsCommand.Connect frm.RemoteHost, frm.Port
End If
End Sub
顯示服務器的回應
當你按下“連接”按鈕,可能會出現兩種情況:一種是由于連接不成功而返回錯誤事件(你可在Winsock控件的幫助文件中查到這些錯誤事件);另一種是連接成功而返回一個Connect事件。如果連接成功,服務器會返回歡迎消息,從而觸發DataArrival事件。下面的代碼被放在該事件中:
Private Sub wsCommand_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
With StatusBar
.ForeColor = vbBlack
.Caption = "wsCommand : DataArrival ("& bytesTotal & " bytes)"
End With
lBytesRes = lBytesRes + bytesTotal
ToolBar.Caption = "Received: " & lBytesRes & " Sent: " & lBytesSent & " "
wsCommand.GetData strData
With txtCommand
.SetFocus
.Text = .Text & strData
.SelStart = Len(.Text)
End With
If Left(strData, 3) = "227" Then
MakeDataConnection strData
ElseIf Left(strData, 3) = "354" Then
bMailData = True
End If
End Sub
每次當Winsock控件從遠程服務器接收到數據時都會觸發DataArrival事件。通過Winsock的GetData方法,我們可以提取這些數據,并將這些數據放在變量strData中。然后我們將這些收到的數據放進文本框中。.SelStart = Len(.Text)語句的作用是使光標跳到文本框中文本的結束處。
輸入命令
我只有一個文本框來接收你想要發送的命令,同時這個文本框還擔負著顯示由服務器傳來的信息。那么程序如何知道它就將哪一行文本看作是你輸入的命令而發送給服務器呢?本程序通過在文本框的KeyPress事件中建立一個“緩沖”的方法來實現。這個“緩沖”實際上是在Keypress事件中的靜態變量,當你敲擊鍵盤時,你所輸入的字符就被儲存在這個靜態變量中,當你按下回車發送命令時,程序將該變量的值清空。下面是程序代碼:
Private Sub txtCommand_KeyPress(KeyAscii As Integer)
Static strBuffer As String
On Error Resume Next
If KeyAscii = 8 Then '捕獲BackSpace鍵
strBuffer = Left$(strBuffer, _ Len(strBuffer) - 1)
Else strBuffer = strBuffer & Chr$(KeyAscii)
End If
If KeyAscii = 13 Then '當按下回車鍵后發送命令。注意必須在命令后加上vbCrLf,否則服務器無法識別你所發出的命令
wsCommand.SendData strBuffer & vbCrLf
strBuffer = ""
End If
End Sub
如果你按了方向鍵,程序將忽略它們,下面的代碼輕松地解決了這個問題。
Private Sub txtCommand_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode > 36 And KeyCode < 41 Then
KeyCode = 0
End If
End Sub
下面的代碼使你在文本框中點擊鼠標的動作無效,免得你到處亂輸東西
Private Sub txtCommand_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
txtCommand.SelStart = Len(txtCommand.Text)
End Sub
斷開與服務器的連接
如果你想關閉本程序或新建立一個連接,你必須斷開當前的連接。為達到這一目的,你必須向服務器發送一個QUIT命令,或者調用Winsock的Close方法。同時有必要等待這一命令完成后再退出程序。通過Winsock的State屬性,我們可以知道這一命令是否已經執行完畢。當Winsock的State屬性等于sckClosed時,就表示socket已關閉了。這時就可以放心大膽地退出程序了。
Private Sub cmdClose_Click()
If Not wsCommand.State = sckClosed
Then wsCommand.Close
Do Until wsCommand.State = sckClosed
DoEvents
Loop
End If
Unload Me
End Sub
開發服務子程序
為了跟蹤Winsock的事件,在每一個子程序中都有一小段代碼,用來在狀態欄中寫入各種消息。這樣我們就能迅速知道結果以及Winsock事件產生的原因。該控件只有7個事件,所以不需要花太多的時間來寫這些代碼?!傲泶鏋椤卑粹o中的代碼是用來保存整個過程的,請注意,文本框最多允許32K的數據。不過清除按鈕,你可以清空整個文本框。
原文轉自:http://www.anti-gravitydesign.com