?? vb用winsock編寫的簡(jiǎn)單聊天程序.txt
字號(hào):
這是一個(gè)簡(jiǎn)單的聊天程序(VB6.0實(shí)現(xiàn)),它可以實(shí)現(xiàn)在局域網(wǎng)中兩臺(tái)主機(jī)間的在線聊天,程序很簡(jiǎn)單,只有短短的幾十行,但“麻雀雖小,五臟俱全”,它已經(jīng)有了聊天程序的大體框架。我們?cè)谒幕A(chǔ)上稍加改進(jìn),就能做出不錯(cuò)的聊天小軟件呢。
為了學(xué)習(xí)方便,提供的源碼已經(jīng)作了詳細(xì)的中文注釋,看看源碼框中的代碼:
Option Explicit
Private IgnoreText As Boolean
'----------------------各控件說(shuō)明----------------------------
'--名稱-------------類型---------------作用------------------
'frmMain Form CHAT主窗體
'Winsock1 Winsock 連接控件
'Label1 Label CONNECT WITH IP標(biāo)簽
'Label2 Label LOCAL PORT標(biāo)簽
'Label3 Label REMOTE PORT標(biāo)簽
'txtRemoteIP TextBox 遠(yuǎn)程IP地址輸入框
'txtLocalPort TextBox 本地PORT輸入框
'txtRemotePort TextBox 遠(yuǎn)程PORT輸入框
'cmdConnect CommandButton 連接CONNECT按鈕
'Label4 Label Type your text and hit Enter to send it.標(biāo)簽
'Frame1(remoteip) Frame REMOTE IP 框架
'Frame2(host ip) Frame HOST IP 框架
'Text1 TextBox 顯示對(duì)方(遠(yuǎn)程主機(jī))發(fā)送的CHAT內(nèi)容
'Text2 TextBox 輸入己方(本地主機(jī))要發(fā)送的CHAT內(nèi)容,按ENTER鍵發(fā)送
'cmdClear CommandButton 清空輸入框(TEXT2)和顯示框(TEXT1)中的內(nèi)容
'StatusBar1 StatusBar 狀態(tài)欄
'-----------------------------------------------------------
'當(dāng)CLEAR按鈕按下時(shí),清空TEXT1和TEXT2中的內(nèi)容
Private Sub cmdClear_Click()
Text1 = ""
With Text2
'清空輸入框
.Text = " "
'并把焦點(diǎn)置于TEXT2
.SetFocus
End With
End Sub
'當(dāng)CONNECT按鈕按下時(shí),進(jìn)行以下操作
Private Sub cmdConnect_Click()
On Error GoTo ErrHandler
With Winsock1
'設(shè)置 RemoteHost 屬性
.RemoteHost = Trim(txtRemoteIP)
'設(shè)置 RemotePort 屬性
'RemotePort 屬性的值應(yīng)該等于 遠(yuǎn)程主機(jī)上的 LocalHost 屬性的值
.RemotePort = Trim(txtRemotePort)
'LocalPort 屬性的值是不能改變的,必須檢查它是否已經(jīng)被設(shè)置
'如果 LocalPort 屬性為空(沒(méi)有被設(shè)置),將其設(shè)為在LocalPort輸入框中輸入的數(shù)值
If .LocalPort = Empty Then
.LocalPort = Trim(txtLocalPort)
Frame2.Caption = .LocalIP
.Bind .LocalPort
'待查
End If
End With
'為了保證使用者不能改變LocalPort的值,將txtLocalPort輸入框鎖定
txtLocalPort.Locked = True
'在狀態(tài)欄中顯示“正在連接”的狀態(tài)
StatusBar1.Panels(1).Text = " Connected to " & Winsock1.RemoteHost & " "
'如果連接正常,做以下設(shè)置
Frame1.Enabled = True
Frame2.Enabled = True
Label4.Visible = True
Text2.SetFocus
Exit Sub
'如果在連接過(guò)程中出現(xiàn)錯(cuò)誤,則轉(zhuǎn)向ErrHandler:,并顯示錯(cuò)誤提示
ErrHandler:
MsgBox "Winsock failed to establish connection with remote server", vbCritical
End Sub
'當(dāng)按下“F1”鍵時(shí)顯示幫助信息
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF1 Then
ChDir App.Path
'調(diào)用外部程序notepad.exe來(lái)打開(kāi)幫助文本文件
Shell "notepad.exe readme.txt", vbNormalFocus
End If
End Sub
'當(dāng)窗體加載時(shí)顯示提示信息并在 txtRemoteIP 框中顯示本地主機(jī)的IP
Private Sub Form_Load()
Show
MsgBox "Winsock UDT Chat" & vbCrLf & "by Theo Kandiliotis (ionikh@hol.gr)" & vbCrLf & vbCrLf & "F1 for help.", vbInformation
txtRemoteIP = Winsock1.LocalIP
End Sub
'接收TEXT2輸入框的按鍵,并做響應(yīng)
Private Sub Text2_KeyPress(KeyAscii As Integer)
'定義變量 Last_Line_Feed 來(lái)記錄最后輸入行的位置
Static Last_Line_Feed As Long
'定義 New_Line 字符串記錄新鍵入的一行文本的內(nèi)容
Dim New_Line As String
'如果使用者按下CLEAR按鈕對(duì)輸入框內(nèi)容清空,這時(shí)TEXT2為空,則重設(shè)最后輸入行的位置為0
If Trim(Text2) = vbNullString Then Last_Line_Feed = 0
'當(dāng)使用者按下ENTER鍵時(shí)
If KeyAscii = 13 Then
'取得最后輸入行的內(nèi)容并賦值給 New_Line 字符串
New_Line = Mid(Text2, Last_Line_Feed + 1)
'重設(shè)最后輸入行的位置
Last_Line_Feed = Text2.SelStart
'通過(guò) WINSOCK 發(fā)送新輸入的一行文本的內(nèi)容
Winsock1.SendData New_Line
'在狀態(tài)欄顯示發(fā)送信息
StatusBar1.Panels(2).Text = " Sent " & (LenB(New_Line) / 2) & " bytes "
End If
End Sub
'當(dāng) WINSOCK 接收到新的數(shù)據(jù)(信息)時(shí),進(jìn)行以下響應(yīng)
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'定義 New_Text 字符串來(lái)記錄新接收的信息
Dim New_Text As String
'接收信息并賦值給 New_Text
Winsock1.GetData New_Text
'在TEXT1顯示框中顯示新接收到的信息
Text1.SelText = New_Text
Frame1.Caption = Winsock1.RemoteHostIP
'在狀態(tài)欄中顯示接收信息
StatusBar1.Panels(2).Text = " Recieved " & bytesTotal & " bytes "
End Sub
'---------------------------------------------------------------------------
'這就是一個(gè)最簡(jiǎn)單的CHAT程序,你可以在它的基礎(chǔ)上加以改進(jìn),做出更實(shí)用的CHAT小軟件。
'---------------------------------------------------------------------------
主打控件WINSOCK解析:
作為這個(gè)CHAT程序的主打控件WINSOCK,我們來(lái)看看它的一些常用屬性、事件和方法。利用WinSock控件可以與遠(yuǎn)程計(jì)算機(jī)建立連接,并通過(guò)用戶數(shù)據(jù)文報(bào)協(xié)議 (UDP)或者傳輸控制協(xié)議 (TCP)進(jìn)行數(shù)據(jù)交換。這兩種協(xié)議都可以用來(lái)創(chuàng)建客戶與服務(wù)器應(yīng)用程序。與 Timer 控件類似,WinSock 控件在運(yùn)行時(shí)是不可見(jiàn)的。
它的主要用途有:
1、創(chuàng)建收集用戶信息的客戶端應(yīng)用程序,并將收集的信息發(fā)送到某中央服務(wù)器。
2、創(chuàng)建一個(gè)服務(wù)器應(yīng)用程序,作為多個(gè)用戶的數(shù)據(jù)的匯入點(diǎn)。
3、創(chuàng)建“聊天”應(yīng)用程序。
WINSOCK的主要屬性有:
●PROTOCOL(控制協(xié)議)屬性,在這個(gè)例子中,我們將PROTOCOL屬性設(shè)置為sckUDPProtocol。這個(gè)協(xié)議一般用于簡(jiǎn)單數(shù)據(jù)交換的情況,而如果我們要編寫INTERNET應(yīng)用程序,多采用TCP協(xié)議。
●屬性RemoteHost是遠(yuǎn)程主機(jī)的地址,LocalPort、RemotePort分別本地主機(jī)的端口和遠(yuǎn)程主機(jī)端口,對(duì)客戶來(lái)說(shuō),該屬性指定發(fā)送數(shù)據(jù)的本地端口,而對(duì)于服務(wù)器來(lái)說(shuō),這是用于偵聽(tīng)的本地端口,我們?cè)谠O(shè)置這兩個(gè)屬性時(shí)必須保證兩臺(tái)主機(jī)的端口值符合下面規(guī)則,即主機(jī)1的LocalPort等于主機(jī)2的RemotePort值,同樣主機(jī)1的RemotePort等于主機(jī)2的LocalPort值,這樣才能保證兩機(jī)通訊的正常進(jìn)行。
●LocalIP屬性用于返回本地機(jī)器的 IP 地址,格式是 IP 地址加點(diǎn)的字符串 (xxx.xxx.xxx.xxx)。
在本例中我們用到了以下幾個(gè)WINSOCK的方法:
●在創(chuàng)建 UDP 應(yīng)用程序時(shí)調(diào)用了 Bind 方法,這是必須的。Bind 方法的作用是為控件“保留”一個(gè)本地端口。例如,如果將控件綁定到1001 號(hào)端口,那么其它應(yīng)用程序?qū)⒉荒苁褂迷摱丝谶M(jìn)行“監(jiān)聽(tīng)”。該方法阻止其它應(yīng)用程序使用同樣的端口。
●SendData 方法用于發(fā)送一條數(shù)據(jù)給另一臺(tái)主機(jī),使用這個(gè)方法的語(yǔ)法是: WinSock.SendData [要發(fā)送的數(shù)據(jù)]
●GetData 方法。當(dāng)DataArrival事件出現(xiàn)時(shí),代碼調(diào)用 GetData 方法獲取數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在字符串變量中。使用語(yǔ)法是:WinSock.GetData [接收數(shù)據(jù)的變量]
●DataArrival事件:在本例中我們使用了DataArrival事件,DataArrival事件在當(dāng)新數(shù)據(jù)到達(dá)時(shí)出現(xiàn)使用的語(yǔ)法為:object_DataArrival (bytesTotal As Long) DataArrival 事件的語(yǔ)法包含下面部分: object 對(duì)象表達(dá)式,其值是“應(yīng)用于”列表中的對(duì)象。 bytesTotal Long型 ,可獲取的數(shù)據(jù)總數(shù)量。
需要說(shuō)明的是:如果沒(méi)有獲取一個(gè) GetData 調(diào)用中的全部數(shù)據(jù),則事件不會(huì)出現(xiàn)。只有存在新數(shù)據(jù)時(shí)才激活事件。可隨時(shí)用 BytesReceived屬性檢查可用的數(shù)據(jù)量。
這就是一個(gè)最簡(jiǎn)單的CHAT程序,你可以在它的基礎(chǔ)上加以改進(jìn),做出更實(shí)用的CHAT小軟件。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -