哪位有 用心跳包 對WINSOCK 控制元件 的連接 進行 有效管理的原始碼
uj5u.com熱心網友回復:
人民幣500,QQ:511606848uj5u.com熱心網友回復:
心跳包了解原理了還不會么?很簡單的,就是定時回圈發送一個代碼到服務器,服務器超過一段時間沒收到就是斷線了
uj5u.com熱心網友回復:
客戶端
Private Sub Form_Load()
tcpClient.RemoteHost = "127.0.0.1"
tcpClient.RemotePort = 12345
End Sub
Private Sub cmdConnect_Click()
'呼叫 Connect 方法,初始化連接。
tcpClient.Connect
End Sub
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
If strData = "02" Then
'// do anything
End If
End Sub
Private Sub Timer1_Timer() '///真正作業的人
On Error Resume Next
If tcpClient.State = 7 Then
tcpClient.SendData "01" '//協議號 01 - 客戶端發送包頭給服務端,通知服務端自己還活著,時間間隔為8s
Else
Label1.Caption = " 已與服務器斷開連接"
End If
End Sub
服務端
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 12345
sckServer(0).Listen
End Sub
Private Sub sckServer_Close(Index As Integer)
Dim a As Integer
For a = 1 To ListView1.ListItems.Count
If sckServer(Index).RemoteHostIP = Split(ListView1.ListItems(a).Text, ":")(1) Then
Me.Caption = Split(ListView1.ListItems(a).Text, ":")(1) & "下線了!--CLOSE判斷出來的!"
ListView1.ListItems.Remove (a)
sckServer(Index).Close
Exit For
End If
Next a
End Sub
Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
With ListView1
.ListItems.Add , , Index & ":" & sckServer(Index).RemoteHostIP
.ListItems.Item(intMax).SubItems(1) = Format(Now, "HH:mm:ss") '//將首次連接的時間添加到該客戶狀態欄上
End With
End If
End Sub
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim GetStr As String
sckServer(Index).GetData GetStr, vbString
Select Case GetStr
Case "01"
Dim i As Integer
For i = 1 To ListView1.ListItems.Count
If Split(ListView1.ListItems(i).Text, ":")(1) = sckServer(Index).RemoteHostIP Then
ListView1.ListItems(i).SubItems(1) = Format(Now, "HH:mm:ss")
'MsgBox Format(Now, "HH:mm:ss")
End If
Next
sckServer(Index).SendData "02" '////協議號 02 服務端收到資訊后回給客戶端的,可以不回復,客戶端那邊沒做處理
End Select
End Sub
Private Sub sckServer_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Dim a As Integer
For a = 1 To ListView1.ListItems.Count
If sckServer(Index).RemoteHostIP = Split(ListView1.ListItems(a).Text, ":")(1) Then
Me.Caption = Split(ListView1.ListItems(a).Text, ":")(1) & "下線了!--ERROR判斷出來的"
ListView1.ListItems.Remove (a)
sckServer(Index).Close
Exit For
End If
Next a
End Sub
Private Sub Timer1_Timer() '///定時檢測客戶端簽到情況,若沒定時簽到則斷開該客戶端,時間間隔為35s
Dim i As Integer
Dim j As Integer
If ListView1.ListItems.Count > 0 Then
For i = 1 To ListView1.ListItems.Count
j = Split(ListView1.ListItems(i).Text, ":")(0) '///分離出INDEX
If Abs(DateDiff("s", Format(Now, "HH:mm:ss"), ListView1.ListItems(i).SubItems(1))) > 11 Then
Me.Caption = Split(ListView1.ListItems(i).Text, ":")(1) & "下線了!--超時判斷出來的"
ListView1.ListItems.Remove (i)
sckServer(j).Close
End If
Next
Else
Exit Sub
End If
End Sub
網上隨便搜來的,看了下代碼原理沒什么問題
這個只是服務器檢測客戶端的,你也可以寫成客戶端檢測服務器的.
原理差不多
將就著看吧,沒除錯
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79562.html
標籤:網絡編程
上一篇:VBA 讀取網頁資料
