用VB編寫網路尋呼機(2) (轉)

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

 

二、在端Server工程中也建立一個窗體,載入WinSock,稱為tcpServer,選擇TCP,設定其Index值為0,並在工程中新增模組。

   內容如下:


Private Type ActiveUser

ClientAs String ’記錄客戶的

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-988131/,如需轉載,請註明出處,否則將追究法律責任。

相關文章