這個是我以前學(xué)習(xí)的一個實例。希望對你有幫助!??!
創(chuàng)新互聯(lián)建站是一家專業(yè)從事網(wǎng)站制作、成都網(wǎng)站制作、網(wǎng)頁設(shè)計的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)建站依托強大的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計開發(fā)服務(wù)!
用VB實現(xiàn)客戶——服務(wù)器(TCP/IP)編程實例
-
現(xiàn)在大多數(shù)語言都支持客戶-服務(wù)器模式編程,其中VB給我們提供了很好的客戶-服務(wù)器編程方式。下面我們用VB來實現(xiàn)TCP/IP網(wǎng)絡(luò)編程。
TCP/IP協(xié)議是Internet最重要的協(xié)議。VB提供了WinSock控件,用于在TCP/IP的基礎(chǔ)上進行網(wǎng)絡(luò)通信。當(dāng)兩個應(yīng)用程序使用Socket進行網(wǎng)絡(luò)通信時,其中一個必須創(chuàng)建Socket服務(wù)器偵聽,而另一個必須創(chuàng)建Socket客戶去連接服務(wù)器。這樣兩個程序就可以進行通信了。
1.創(chuàng)建服務(wù)器,首先創(chuàng)建一個服務(wù)端口號。并開始偵聽是否有客戶請求連接。
建立一窗體,并向其增加一個Winsock控件(可在工程菜單中的部件項來添加此控件)
添加兩文本框Text1,Text2,和一按鈕Command1
Private Sub Form_Load()
SockServer.LocalPort = 2000 ′服務(wù)器端口號,最好大于1000
SockServer.Listen ′開始偵聽
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockServer.Close
End Sub
Private Sub SockServer_Close()
SockServer.Close
End Sub
Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)
SockServer.Close
SockServer.Accept requestID ′表示客戶請求連接的ID號
End Sub
′當(dāng)客戶向服務(wù)器發(fā)送數(shù)據(jù)到達后,產(chǎn)生DataArrival事件,在事件中接收數(shù)據(jù),GetData方法接收數(shù)據(jù)。
Private Sub SockServer_Data
Arrival(ByVal bytesTotal As Long)
Dim s As String
SockServer.GetData s
Text1.Text = s
End Sub
當(dāng)我需要向客戶發(fā)送數(shù)據(jù)時,只需調(diào)用SendData方法。
Private Sub Command1_Click()
SockServer .SendData Text2.Text
text1.text = text2.text
text2.text = ""
End Sub
2.創(chuàng)建客戶。要創(chuàng)建客戶連接服務(wù)器,首先設(shè)置服務(wù)器主機名,如IP地址、域名或計算機名,然后設(shè)置服務(wù)器端口,最后連接服務(wù)器。
建立一窗體,并向其增加一個Winsock控件(可在工程菜單中的部件項來添加此控件),取名為:SockC1。添加兩文本框Text1,Text2,和一按鈕Command1
Private Sub Form_Load()
dim my as string
my = SockCl.RemoteHostIP
SockCl.RemoteHost = my
′表示服務(wù)器主機名
SockCl.RemotePort = 2000
′表示服務(wù)器端口名
SockCl.Connect
′連接到服務(wù)器
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockCl.Close
End Sub
Private Sub SockCl_Close()
SockCl.Close
End Sub
Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockCl.GetData s ′接收數(shù)據(jù)到文本框中
Text1.Text = s
End Sub
Private Sub Command1_Click()
SockCl.SendData Text2.Text ′向服務(wù)器發(fā)送數(shù)據(jù)
text1.text = text2.text
text2.text = ""
End Sub
3.進行通信。把這兩個窗體分別編譯成兩個EXE文件,服務(wù)器Server.exe和客戶Client.exe程序,并把它們分別安裝在服務(wù)器端和客戶端,這樣就可以實現(xiàn)兩者通信了。
------------------------------------整理后的代碼如下-------------------------------
Private Sub Form_Load()
Dim my As String
my = SockCl.RemoteHostIP
SockCl.RemoteHost = my
SockCl.RemotePort = 2000
SockCl.Connect
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockCl.Close
End Sub
Private Sub SockCl_Close()
SockCl.Close
End Sub
Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockCl.GetData s
Text1.Text = s
End Sub
Private Sub Command1_Click()
SockCl.SendData Text2.Text
Text1.Text = Text2.Text
Text2.Text = ""
End Sub
Private Sub Form_Load()
SockServer.LocalPort = 2000
SockServer.Listen
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockServer.Close
End Sub
Private Sub SockServer_Close()
SockServer.Close
End Sub
Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)
SockServer.Close
SockServer.Accept requestID
End Sub
Private Sub Command1_Click()
SockServer.SendData Text2.Text
Text1.Text = Text2.Text
Text2.Text = ""
End Sub
Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockServer.GetData s
Text1.Text = s
End Sub
用VB做聊天程序的方法
---- 所謂"聊天"是指兩個程序能夠發(fā)送數(shù)據(jù)給對方。這個程序涉及到數(shù)據(jù)通訊的知識,仿佛很復(fù)雜,不過,由于VB給我們提供了一個Winsock控件,問題就變得很簡單了。
---- 先編寫"聊天(主機)"程序。在窗體里添加Winsock控件,并設(shè)置其Protocol屬性為1-SckUDPProtocol,其他屬性為缺省值。接著添加兩個標(biāo)簽和兩個文本框,設(shè)置兩個標(biāo)簽的標(biāo)題屬性分別為"接收窗"和"發(fā)送窗";兩個文本框的標(biāo)題屬性為空。最后編寫代碼:
---- 1."聊天(主機)"
Private Sub Form-Load()
′設(shè)置網(wǎng)絡(luò)地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1999
End Sub
Private Sub Text1-Change()
′發(fā)送用戶輸入的內(nèi)容
Winsock1.SendData Text1.Text
End Sub
Private Sub Winsock1-DataArrival
(Byval bytesTotal As Long)
Dim rec As String
′接收對方數(shù)據(jù)并在文本框內(nèi)顯示
Winsock1.GetData rec, vb String
Text2.Text=rec
End Sub
---- 2."聊天(副機)"
Private Sub Form_Load()
′設(shè)置網(wǎng)絡(luò)地址
Winsock1.LocalPort=1999
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1024
---- 其他部分程序與(主機)相同。最后將兩個程序存盤,并編譯成執(zhí)行(.Exe)文件。現(xiàn)在就可以使用這個程序進行對話了。
---- 七.文本框中文本的某一特定字符或字符串同時高亮顯示的方法
---- 由于普通TextBox控件不支持不連續(xù)字符串的同時高亮顯示,所以我們選擇RichTextBox控件。單擊工程(Project)選單項,在彈出的下拉選單中單擊組件(Components)選單項,從彈出的對話框中選擇Microsoft Rich Textbox Control 5.0復(fù)選框,確定加載RichTextBox控件。
---- 新建(New)一個工程,在窗體(Form)上添加一個RichTextBox控件和兩個Command(按鈕)控件,都采用系統(tǒng)默認(rèn)的Name屬性值;設(shè)置RichTextBox的Text屬性值為空,Command1和Command2的Caption屬性值分別設(shè)為"輸入文本"和"選擇字符串"。最后,添加如下VB代碼:
Private Sub Command1-Click()
Dim str As String
Dim Text As String
str=〃輸入文本〃
Text=InputBox(str)
RichTextBox1.Text=Text
End Sub
Private Sub Command2-Click()
Dim str As String
Dim Text As String
Dim Position As Integer
Dim Lenth As Integer
str=〃輸入要高亮顯示的字符串〃
Text=InputBox(str)
If Text 〈〉 〃〃 Then
Position=InStr(RichTextBox1.Text, Text)-1
Lenth=Len(Text)
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Do While InStr(Position+Lenth+
1, RichTextBox1.Text, Text) 〈〉 0
Position=InStr(Position+Lenth+
1, RichTextBox1.Text, Text)-1
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Loop
End If
End Sub
---- 按F5執(zhí)行程序,單擊"輸入文本"按鈕,在彈出的對話框中輸入一些文本,確定后,剛剛輸入的文本將顯示在RichTextBox中;再單擊"選擇字符串"按鈕,在彈出的對話框中輸入你希望高亮顯示的字符串,確定后,RichTextBox中相應(yīng)的字符串將以紅色高亮顯示。
---- 八.編程實現(xiàn)Windows 95/98操作系統(tǒng)熱啟動的方法
---- 要利用程序?qū)崿F(xiàn)系統(tǒng)的重新啟動,可以在你的程序中調(diào)用API函數(shù)來實現(xiàn)。建一個子函數(shù):(以VB為例)
Declare Function SystemParametersInfo Lib 〃
user32〃 Alias -
〃SystemParametersInfo〃 (ByVal uAction As Long,
ByVal uParam As Long,
ByVal lpvParam As Any, ByVal
fuWinIni As Long) As Long
Sub DisableCtrlAltDelete(bDisabled As Boolean)
Dim X As Long
X=SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
Call DisableCtrlAltDelete(true) ′禁止熱啟
Call DisableCtrlAltDelete(false) ′允許熱啟
---- 九.在Windows 95/ 98啟動后自動啟動程序的方法
---- 我們都知道在Windows 95/98的"開始"→"程序"選單下有一"啟動"選單項,當(dāng)每次啟動Windows 95或Windows 98時,系統(tǒng)都會自動啟動放在"啟動"選單欄里的可執(zhí)行程序。
---- 但目前有好多軟件,像解霸五、ICQ,以及大部分實時偵測病毒的軟件等等,安裝后,并沒有放在"啟動"選單里,也能在啟動操作系統(tǒng)時自動啟動。怎么實現(xiàn)的呢?
---- 其實只要知道Windows注冊表的一些知識,這個問題就不能稱之為問題了。用鼠標(biāo)單擊"開始",打開開始選單,再單擊"運行",出現(xiàn)一對話框,然后輸入"regedit",確定后,會打開系統(tǒng)注冊表編輯器,找到HKEY-LOCAL-MACHINE? SOFTWARE?Microsoft?Windows?CurrentVersion?Run,加入你的程序的入口,就可以了。如果不知道怎么加,就參考一下已經(jīng)存在的鍵值。
---- 十. 如何把數(shù)據(jù)文件輸出到Text控件中?如果數(shù)據(jù)量比較大,窗體滿屏也不夠大,怎么解決?
---- 有一個比較簡單的方法,就是把數(shù)據(jù)放到一個文本框(Text)里,并在其中加上水平和垂直滾動條。具體實現(xiàn)步驟為:先在窗體(Form)里加入一個文本框,采用默認(rèn)名Text1;然后,設(shè)置文本框Text1的屬性:Text屬性設(shè)置為空,MultiLine屬性設(shè)置為True,ScrollBars屬性設(shè)置為3-Both;接著添加如下VB代碼:
Private Sub Form-Load()
Dim Handle As Integer
Dim FileName As String
On Error GoTo ErrExit
begin:
′輸入要顯示的數(shù)據(jù)文件的名稱
FileName=InputBox$(〃Input Filename〃,
〃Open File〃)
On Error GoTo FileErr
Handle=FreeFile
Open FileName For Input As #Handle
′把數(shù)據(jù)文件中的數(shù)據(jù)輸出到文本框中
Text1.Text=Input$(LOF(Handle), Handle)
Close #Handle
Exit Sub
FileErr:
Dim ErrNum As Integer
If Err.Number=53 Then
ErrNum=MsgBox(〃File not exist〃,
vbOKCancel, 〃Error Information〃)
If ErrNum=1 Then
GoTo begin
Else
Exit Sub
End If
End If
MsgBox Err.Description, , 〃file open failed〃
ErrExit:
Exit Sub
End Sub
′使文本框充滿整個窗體
Private Sub Form-Resize()
Text1.Left=0
Text1.Top=0
Text1.Width=Form1.Width-100
Text1.Height=Form1.Height-400
End Sub
---- 通過這樣的處理,不僅能解決問題,而且用戶還可以在文本框中對數(shù)據(jù)進行編輯。
---- 十一.關(guān)聯(lián)文件列表框、目錄列表框和驅(qū)動器列表框的方法
---- 想做一個對話窗體,包含驅(qū)動器列表框、目錄列表框和文件列表框,并能實現(xiàn)三者的同步操作,怎么做?這都是我們在實際應(yīng)用中經(jīng)常會遇到的問題,在VB中解決這個問題非常簡單,可以通過Path屬性的改變引發(fā)Change事件來實現(xiàn)。例如:
Sub Dir1-Change()
File1.Path=Dir1.Path
End Sub
---- 該事件過程使窗體上的目錄列表框Dir1和文件列表框File1產(chǎn)生同步。因為目錄列表框Path屬性的改變將產(chǎn)生Change事件,所以在Dir1-Change事件過程中,把Dir1.Path賦給File1.Path,就可以產(chǎn)生同步效果。類似地,增加下面的事件過程,就可以使三種列表框同步操作:
Sub Drive1-Change()
Dir1.Path=Drive1.Drive
End Sub
---- 該過程使驅(qū)動器列表框和目錄列表框同步,前面的過程使目錄列表框和文件列表框同步,從而使三種列表框同步,問題即可解決。
加一個WInsock1控件,兩個文本框(txtMess、txtSend)和一個按鈕,代碼如下Private Sub Command1_Click()
Winsock1.SendData txtSend.Text '發(fā)送聊天內(nèi)容
txtSend.Text = "" '聊天內(nèi)容清空
End SubPrivate Sub Form_Load()
Dim my As String
Winsock1.Protocol = sckUDPProtocol '設(shè)置為UDP協(xié)義
Winsock1.LocalPort = 60 '隨便設(shè)置,不過兩個要一樣
Winsock1.RemotePort = 60
my = Winsock1.LocalIP '取得自己的IP地址,是不要的
Winsock1.RemoteHost = my '這里應(yīng)該是改為別人計算機的IP,由于自己是單機,所以就設(shè)置成自己的,自己給自己發(fā)信息,可以拿另一臺主機試試End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '取到數(shù)據(jù)時發(fā)生
Dim Tmp As String
Winsock1.GetData Tmp, vbString '取得數(shù)據(jù)
Tmp = "對方IP地址:" + Winsock1.RemoteHostIP + "發(fā)送內(nèi)容為--" + Tmp
txtMess.Text = Tmp + Chr$(13) + Chr$(10) + txtMess.Text '換行輸出聊天信息
End Sub語句超簡單,我用了幾小時才弄出。