編寫網路尋呼機 (轉)

worldblog發表於2007-12-09
編寫網路尋呼機 (轉)[@more@]

 

編寫尋呼機 作者:嶽兵   提起ICQ的大名,愛好的朋友一定不會感到陌生的吧?ICQ就是網際網路上的尋呼機,無論什麼時候,只要你的朋友線上,


你只需在ICQ中輸入他的ID號碼,你就可以在網際網路上呼到他。ICQ由於其方便、快捷,且擁有眾多的註冊而一舉成為網際網路上最流行的網路尋呼機,


它幾乎成為每一個上網使用者的必備之物。當你在使用ICQ的時候,是否會想過自己動手編寫一個網路尋呼機呢?這其實在VB中就可以實現。   網路尋呼的原理就是當客戶端連線時,透過伺服器搜尋所要呼叫的ID號碼,如果檢測到此使用者且該使用者正處於聯網狀態,


則伺服器通知此使用者的客戶端程式響應主叫方客戶端程式,然後在主叫方和被叫方建立連線後,雙方就可以或進行其它的通訊。   在VB中編寫網路尋呼機需要建立兩個程式,一個為客戶端程式Client,一個為伺服器端程式Server。   一、在Client工程中建立一個窗體,載入WinSock,稱為tcpClient,選擇TCP。再加入四個文字框,


用以輸入伺服器的、伺服器埠號,被呼叫的網路尋呼ID號以及使用者登入ID號。然後再在窗體中加入三個按鈕,


分別命名為“連線”、“斷開”和“退出”,點選“連線”按鈕,並進行如下初始化連線,程式碼如下: Private Sub Command1_Click()  If Len(Text1.Text) = 0 And Len(Text2.Text) = 0 Then   MsgBox ("請輸入主機名或主機IP地址。")   Exit Sub  ElseIf Len(Text1.Text) > 0 Then   tcpClient.RemoteHost = Text1.Text   tcpClient.RemotePort = Text2.Text  End If  tcpClient.Connect  Timer1.Enabled = True End Sub Private Sub Command2_Click()  tcpClient.Close   '斷開連線 End Sub Private Sub Command3_Click()  End End Sub Private Sub Form_Load()  Text2.Text = "1001" End Sub Private Sub tcpClient_Connect()  tcpClient.SendData (Text3.Text&"@"&Text4.Text) End Sub Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)  Dim strData As String  tcpClient.GetData strData  strData = strData + "呼叫"  '在收到呼叫訊息後彈出一對話方塊並顯示主叫方ID號碼 MsgBox (strData) End Sub   二、在伺服器端Server工程中也建立一個窗體,載入WinSock控制元件,


稱為tcpServer,協議選擇TCP,設定其Index值為0,並在工程中新增模組。內容如下: Private Type ActiveUser  ClientAs String    '記錄客戶的IP地址 ClientPort As Integer  '記錄當前會話的埠 ClientID As Long     '記錄客戶的ID號碼 ClientConnected As Boolean '客戶連線狀態,True表示已連線,False表示沒有連線 End Type Dim CurUser() As ActiveUser Dim tcpIndex As Integer  '跟蹤當前建立連線數   在Form_Load事件中加入如下程式碼: Private Sub Form_Load()  tcpServer(0).Protocol = sckTCPProtocol  tcpServer(0).LocalPort = 1001  '將 LocalPort 屬性設定為一個整數。 tcpServer(0).Listen  '然後 Listen 方法。 tcpIndex = 1 End Sub   準備應答客戶端程式的請求連線,使用ConnectionRequest事件來應答戶端程式的請求,程式碼如下: Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)  Dim i As Integer  On Error GoTo ErrHandle  For i = 1 To tcpIndex  '選擇一個空閒埠  If CurUser(i).ClientConnected = False And i < > tcpIndex Then    Load tcpServer(i)    tcpServer(i).LocalPort = CurUser(i).ClientPort - 1    tcpServer(i).Accept requestID    Exit For   ElseIf CurUser(i).ClientConnected = False Then     Load tcpServer(i)     tcpServer(i).LocalPort = Port     If tcpServer(i).State < > sckClosed Then      tcpServer(i).Close     End If     tcpServer(i).Accept requestID     Exit For   End If  Next  DoEvents  '測試連線是否成功 If tcpServer(i).State = sckConnected Then   If i = tcpIndex Then      '已經沒有可用埠,記錄客戶的IP地址和埠號   tcpIndex = tcpIndex + 1    Port = Port + 1    ReDim Preserve CurUser(tcpIndex)    CurUser(i).ClientIP = tcpServer(i).RemoteHostIP    CurUser(i).ClientConnected = True    CurUser(i).ClientPort = Port    CurUser(tcpIndex).ClientConnected = False   Else    CurUser(i).ClientIP = tcpServer(i).RemoteHostIP    CurUser(i).ClientPort = Port    CurUser(i).ClientConnected = True   End If  End If  Exit Sub  ErrHandle:   Resume Next   '檢查控制元件的 State 屬性,如未關閉,在接受新的連線之前關閉此連線。  If tcpServer(0).State <> sckClosed Then   tcpServer(0).Close   tcpServer(0).Accept requestID    '接受具有 requestID 引數的,連線。 End Sub Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)  Dim i As Integer  Dim s As String  Dim RequID As Long  '主叫方ID號碼 Dim SearchID As Long '被叫方ID號碼  On Error GoTo ErrHandle  tcpServer(Index).GetData s, vbString  '接收資料並存入s    If Mid(s, i, 1) = "@" Then   '分離s中的主叫方和被叫方ID號碼  SearhID = Left(s, i - 1)  '把號存入mKey   RequID = Right(s, Len(s) - i) 'ID存入RequID  End If  '如果是請求尋呼某一ID號碼,則檢索當前此ID使用者是否登入(即CurUser陣列中是否存在此使用者),


然後傳送資訊,通知此使用者響應呼叫並顯示主叫使用者ID號碼。 For i = 1 To tcpIndex   If RequID = CurUser(i).ClientID And CurUser(i).ClientConnected = True Then    tcpServer(i).SendData (SearhID)   End If  Next  Exit Sub  ErrHandle:   If Err.Number = sckBadState Then  '連線不正確    CurUser(i).ClientConnected = False     CurUser(i).ClientIP = ""     Unload tcpServer(i)     Resume Next   End If End Sub   本程式僅提供了用 編寫網路尋呼的思路和主要部分的實現過程,至於主叫方和被叫方建立連線後的通訊並未擴充套件,


讀者若有興趣,可在這方面加入具體的實現程式碼,就可以給本程式增加更多的功能,如實時聊天,語音對話等。如果在伺服器程式檢索到被叫方時,


分別通知兩者客戶端程式,使主叫方和被叫方直接利用IP地址進行連線,則兩者的連線速度將會有大幅度的提高。


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

相關文章