明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

如何用VB編寫網(wǎng)絡(luò)尋呼

[摘要]作者:岳兵 提起ICQ的大名,愛(ài)好電腦的朋友一定不會(huì)感到陌生的吧?ICQ就是互聯(lián)網(wǎng)上的尋呼機(jī),無(wú)論什么時(shí)候,只要你的朋友在線,你只需在ICQ中輸入他的ID號(hào)碼,你就可以在互聯(lián)網(wǎng)上呼到他。ICQ由于其方便、快捷,且擁有眾多的注冊(cè)用戶而一舉成為互聯(lián)網(wǎng)上最流行的網(wǎng)絡(luò)尋呼機(jī),它幾乎成為每一個(gè)上網(wǎng)用戶的必備...
作者:岳兵

提起ICQ的大名,愛(ài)好電腦的朋友一定不會(huì)感到陌生的吧?ICQ就是互聯(lián)網(wǎng)上的尋呼機(jī),無(wú)論什么時(shí)候,只要你的朋友在線,你只需在ICQ中輸入他的ID號(hào)碼,你就可以在互聯(lián)網(wǎng)上呼到他。ICQ由于其方便、快捷,且擁有眾多的注冊(cè)用戶而一舉成為互聯(lián)網(wǎng)上最流行的網(wǎng)絡(luò)尋呼機(jī),它幾乎成為每一個(gè)上網(wǎng)用戶的必備之物。當(dāng)你在使用ICQ的時(shí)候,是否會(huì)想過(guò)自己動(dòng)手編寫一個(gè)網(wǎng)絡(luò)尋呼機(jī)呢?這其實(shí)在VB中就可以實(shí)現(xiàn)。
  網(wǎng)絡(luò)尋呼的原理就是當(dāng)客戶端程序連接服務(wù)器時(shí),通過(guò)服務(wù)器搜索所要呼叫的ID號(hào)碼,如果檢測(cè)到此用戶且該用戶正處于聯(lián)網(wǎng)狀態(tài),則服務(wù)器通知此用戶的客戶端程序響應(yīng)主叫方客戶端程序,然后在主叫方和被叫方建立連接后,雙方就可以聊天或進(jìn)行其它的通信。
  在VB中編寫網(wǎng)絡(luò)尋呼機(jī)需要建立兩個(gè)程序,一個(gè)為客戶端程序Client,一個(gè)為服務(wù)器端程序Server。

  一、在Client工程中建立一個(gè)窗體,加載WinSock控件,稱為tcpClient,協(xié)議選擇TCP。再加入四個(gè)文本框,用以輸入服務(wù)器的IP地址、服務(wù)器端口號(hào),被呼叫的網(wǎng)絡(luò)尋呼ID號(hào)以及用戶登錄ID號(hào)。然后再在窗體中加入三個(gè)按鈕,分別命名為“連接”、“斷開(kāi)”和“退出”,點(diǎn)擊“連接”按鈕,并進(jìn)行如下初始化連接,代碼如下:

 Private Sub Command1_Click()
  If Len(Text1.Text) = 0 And Len(Text2.Text) = 0 Then
   MsgBox ("請(qǐng)輸入主機(jī)名或主機(jī)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   '斷開(kāi)連接
 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 + "呼叫"
  '在收到呼叫消息后彈出一對(duì)話框并顯示主叫方ID號(hào)碼
  MsgBox (strData)
 End Sub

  二、在服務(wù)器端Server工程中也建立一個(gè)窗體,加載WinSock控件,稱為tcpServer,協(xié)議選擇TCP,設(shè)置其Index值為0,并在工程中添加模塊。

  內(nèi)容如下:

 Private Type ActiveUser
  ClientIP As String '記錄客戶的IP地址
  ClientPort As Integer '記錄當(dāng)前會(huì)話的端口
  ClientID As Long '記錄客戶的ID號(hào)碼
  ClientConnected As Boolean '客戶連接狀態(tài),True表示已連接,F(xiàn)alse表示沒(méi)有連接
 End Type
 Dim CurUser() As ActiveUser
 Dim tcpIndex As Integer '跟蹤當(dāng)前建立連接數(shù)

  在Form_Load事件中加入如下代碼:

 Private Sub Form_Load()
  tcpServer(0).Protocol = sckTCPProtocol
  tcpServer(0).LocalPort = 1001 '將 LocalPort 屬性設(shè)置為一個(gè)整數(shù)。
  tcpServer(0).Listen '然后調(diào)用 Listen 方法。
  tcpIndex = 1
 End Sub

  準(zhǔn)備應(yīng)答客戶端程序的請(qǐng)求連接,使用ConnectionRequest事件來(lái)應(yīng)答戶端程序的請(qǐng)求,代碼如下:


 Private Sub tcpServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
  Dim i As Integer
  On Error GoTo ErrHandle
  For i = 1 To tcpIndex '選擇一個(gè)空閑端口
   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
   '測(cè)試連接是否成功
   If tcpServer(i).State = sckConnected Then
    If i = tcpIndex Then
    '已經(jīng)沒(méi)有可用端口,記錄客戶的IP地址和端口號(hào)
    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 屬性,如未關(guān)閉,在接受新的連接之前關(guān)閉此連接。
  If tcpServer(0).State <> sckClosed Then
   tcpServer(0).Close
   tcpServer(0).Accept requestID '接受具有 requestID 參數(shù)的,連接。
  End If
 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號(hào)碼
  Dim SearchID As Long '被叫方ID號(hào)碼
  On Error GoTo ErrHandle
  tcpServer(Index).GetData s, vbString '接收數(shù)據(jù)并存入s 
  If Mid(s, i, 1) = "@" Then
  '分離s中的主叫方和被叫方ID號(hào)碼
   SearhID = Left(s, i - 1) '把號(hào)存入mKey
   RequID = Right(s, Len(s) - i) 'ID存入RequID
  End If
  '如果是請(qǐng)求尋呼某一ID號(hào)碼,則檢索當(dāng)前此ID用戶是否登錄(即CurUser數(shù)組中是否存在此用戶),然后發(fā)送信息,通知此用戶響應(yīng)呼叫并顯示主叫用戶ID號(hào)碼。
  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
 Sub ErrHandle:
  If Err.Number = sckBadState Then '連接不正確
   CurUser(i).ClientConnected = False
   CurUser(i).ClientIP = ""
   Unload tcpServer(i)
   Resume Next
  End If
End Sub


  本程序僅提供了用Visual Basic 編寫網(wǎng)絡(luò)尋呼的思路和主要部分的實(shí)現(xiàn)過(guò)程,至于主叫方和被叫方建立連接后的通信并未擴(kuò)展,讀者若有興趣,可在這方面加入具體的實(shí)現(xiàn)代碼,就可以給本程序增加更多的功能,如實(shí)時(shí)聊天,語(yǔ)音對(duì)話等。如果在服務(wù)器程序檢索到被叫方時(shí),分別通知兩者客戶端程序,使主叫方和被叫方直接利用IP地址進(jìn)行連接,則兩者的連接速度將會(huì)有大幅度的提高。