cWinsock 属性参考
📋 属性列表
| 属性名 | 类型 | 读写 | 说明 |
|---|---|---|---|
State | WinsockState | 只读 | 当前 Socket 状态 |
Protocol | WinsockProtocol | 读写 | 协议类型(TCP/UDP) |
RecvBuffer | Byte() | 读写 | 自定义接收缓冲区 |
LocalPort | Long | 读写 | 本地端口 |
RemoteHost | String | 读写 | 远程主机名 |
RemotePort | Long | 读写 | 远程端口 |
RemoteHostIP | String | 只读 | 解析后的远程 IP 地址 |
LocalHostName | String | 只读 | 本地主机名 |
LocalIP | String | 只读 | 本地 IP 地址 |
Tag | String | 读写 | 用户自定义标签 |
UserData | Variant | 读写 | 用户自定义数据 |
SocketHandle | Long | 只读 | Socket 句柄 |
BytesReceived | Long | 只读 | 可用数据字节数 |
IsServer | Boolean | 只读 | 是否为服务器模式 |
IsAcceptedClient | Boolean | 只读 | 是否为服务器接受的客户端 |
ParentServer | cWinsock | 只读 | 父服务器对象(仅客户端) |
Clients | Collection | 只读 | 所有连接的客户端集合(仅服务器) |
ClientCount | Long | 只读 | 客户端连接数(仅服务器) |
CurrentUser | Variant | 读写 | 绑定的用户名(用户绑定功能) |
CurrentUserToken | String | 读写 | 用户认证令牌(用户绑定功能) |
CurrentUserInfo | cJson | 读写 | 用户扩展信息(用户绑定功能) |
CountUsers | Long | 只读 | 当前绑定的用户数量(用户绑定功能) |
CountGroups | Long | 只读 | 当前组数量(用户绑定功能) |
PacketHandler | cPacketProtocol | 读写 | 封包协议处理器对象(高级配置) |
PacketProtocol | PacketProtocolType | 读写 | 封包协议类型(快速设置) |
Delimiter | String | 读写 | 分隔符协议的分隔符(默认 vbCrLf) |
FixedLength | Long | 读写 | 定长协议的消息长度 |
HeaderBytes | Long | 读写 | 长度头协议的头字节数(2或4,默认4) |
HeaderEndian | EndianEnum | 读写 | 长度头协议的字节序(默认小端) |
MaxPacketSize | Long | 读写 | 单包最大字节数(默认1MB),防恶意超大包 |
MaxBufferSize | Long | 读写 | 缓冲区累积上限(默认4MB),防内存耗尽 |
Heartbeat | cHeartbeat | 只读 | 心跳管理器对象(高级配置) |
AutoHeartbeat | Boolean | 读写 | 启用/禁用自动心跳(内嵌 cTimer) |
HeartbeatTimeout | Long | 读写 | 服务端心跳超时秒数(默认120) |
HeartbeatInterval | Long | 读写 | 客户端心跳间隔秒数(默认50) |
HeartbeatData | Byte() | 读写 | 心跳包内容(默认单字节0) |
IdleSeconds | Long | 只读 | 当前空闲秒数 |
🔄 State 属性
说明
返回当前 Socket 的状态。
语法
Property Get State() As WinsockState返回值
| 常量 | 值 | 说明 |
|---|---|---|
sckClosed | 0 | 已关闭 |
sckOpen | 1 | 已打开(UDP 绑定后) |
sckListening | 2 | 监听中(TCP 服务器) |
sckConnectionPending | 3 | 连接挂起 |
sckResolvingHost | 4 | 正在解析主机名 |
sckHostResolved | 5 | 主机名已解析 |
sckConnecting | 6 | 正在连接 |
sckConnected | 7 | 已连接 |
sckClosing | 8 | 正在关闭 |
sckError | 9 | 发生错误 |
使用示例
Private Sub cmdConnect_Click()
If m_oClient.State = sckClosed Then
m_oClient.Connect "127.0.0.1", 8080
Else
MsgBox "Socket 未关闭,当前状态: " & GetStateName(m_oClient.State)
End If
End Sub
Private Function GetStateName(ByVal eState As WinsockState) As String
Select Case eState
Case sckClosed: GetStateName = "已关闭"
Case sckOpen: GetStateName = "已打开"
Case sckListening: GetStateName = "监听中"
Case sckConnected: GetStateName = "已连接"
Case sckClosing: GetStateName = "关闭中"
Case sckError: GetStateName = "错误"
Case Else: GetStateName = "未知"
End Select
End Function🌐 Protocol 属性
说明
获取或设置 Socket 使用的协议类型。
语法
Property Get Protocol() As WinsockProtocol
Property Let Protocol(ByVal Value As WinsockProtocol)值
| 常量 | 值 | 说明 |
|---|---|---|
sckTCPProtocol | 1 | TCP 协议(可靠,面向连接) |
sckUDPProtocol | 2 | UDP 协议(不可靠,无连接) |
使用示例
' 设置为 TCP 协议
m_oSocket.Protocol = sckTCPProtocol
' 设置为 UDP 协议
m_oSocket.Protocol = sckUDPProtocol
' 检查当前协议
If m_oSocket.Protocol = sckTCPProtocol Then
Debug.Print "使用 TCP 协议"
Else
Debug.Print "使用 UDP 协议"
End If⚠️ 注意事项
- 只能在
State = sckClosed时修改 - 修改后需要重新调用
Connect()、Listen()或Bind()
📦 RecvBuffer 属性
说明
设置或获取自定义接收缓冲区。通常用于高级场景。
语法
Property Let RecvBuffer(ByRef Value() As Byte)使用示例
' 设置自定义缓冲区
Dim baCustomBuffer() As Byte
ReDim baCustomBuffer(0 To 8191) ' 8KB 缓冲区
m_oSocket.RecvBuffer = baCustomBuffer🔌 LocalPort 属性
说明
获取或设置本地端口号。
语法
Property Get LocalPort() As Long
Property Let LocalPort(ByVal Value As Long)使用示例
' 设置本地端口(必须在调用 Connect/Listen/Bind 之前)
m_oServer.LocalPort = 8080
m_oServer.Listen
' 获取实际绑定的端口
Debug.Print "本地端口: " & m_oSocket.LocalPort⚠️ 注意事项
- 只能在
State = sckClosed时设置 - 范围:0-65535
- 0 表示由系统自动分配
🌍 RemoteHost 属性
说明
获取或设置远程主机名(域名或 IP)。
语法
Property Get RemoteHost() As String
Property Let RemoteHost(ByVal Value As String)使用示例
' 设置远程主机(可以使用域名)
m_oClient.RemoteHost = "example.com"
m_oClient.RemotePort = 80
m_oClient.Connect
' 使用 IP 地址
m_oClient.RemoteHost = "192.168.1.100"
m_oClient.RemotePort = 8080
m_oClient.Connect
' 获取远程主机名
Debug.Print "远程主机: " & m_oClient.RemoteHost🔢 RemotePort 属性
说明
获取或设置远程端口号。
语法
Property Get RemotePort() As Long
Property Let RemotePort(ByVal Value As Long)使用示例
' 设置远程端口
m_oClient.RemotePort = 8080
' 获取远程端口
Debug.Print "远程端口: " & m_oClient.RemotePort🖥️ RemoteHostIP 属性
说明
获取解析后的远程 IP 地址(只读)。
语法
Property Get RemoteHostIP() As String使用示例
Private Sub m_oClient_Connect(Client As cWinsock)
Debug.Print "连接成功!"
Debug.Print "主机名: " & Client.RemoteHost
Debug.Print "IP 地址: " & Client.RemoteHostIP
Debug.Print "端口: " & Client.RemotePort
End Sub特殊情况:UDP 服务器虚拟客户端
Private Sub m_oUdp_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
' UDP 服务器模式下,虚拟客户端的 RemoteHostIP 返回发送方 IP
Debug.Print "收到来自 " & Client.RemoteHostIP & ":" & Client.RemotePort & " 的数据"
End Sub💻 LocalHostName 属性
说明
获取本地主机名。
语法
Property Get LocalHostName() As String使用示例
Debug.Print "本机名: " & m_oSocket.LocalHostName🌐 LocalIP 属性
说明
获取本地 IP 地址。
语法
Property Get LocalIP() As String使用示例
Debug.Print "本机 IP: " & m_oSocket.LocalIP🏷️ Tag 属性
说明
用户自定义标签,用于标识对象。
语法
Property Get Tag() As String
Property Let Tag(ByVal Value As String)使用示例
' 为每个客户端设置标签
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
' 服务器会自动设置 Tag 为 "#1", "#2", "#3"...
' 也可以自定义
Client.Tag = "客户端-" & Client.RemoteHostIP
Debug.Print "新客户端 Tag: " & Client.Tag
End Sub
' 通过 Tag 查找客户端
Private Function FindClientByTag(ByVal sTag As String) As cWinsock
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
If oClient.Tag = sTag Then
Set FindClientByTag = oClient
Exit Function
End If
Next
Set FindClientByTag = Nothing
End Function💾 UserData 属性
说明
用户自定义数据存储,可以存储任意类型的数据。
语法
Property Get UserData() As Variant
Property Let UserData(ByVal Value As Variant)
Property Set UserData(ByVal Value As Variant)使用示例
' 存储字符串
m_oClient.UserData = "用户信息: 张三"
' 存储数字
m_oClient.UserData = 12345
' 存储对象
Dim oUserInfo As New CUserInfo
oUserInfo.Name = "张三"
oUserInfo.Age = 25
Set m_oClient.UserData = oUserInfo
' 读取数据
Dim sInfo As String
sInfo = m_oClient.UserData
Debug.Print sInfo
' 读取对象
Dim oUserData As CUserInfo
Set oUserData = m_oClient.UserData
Debug.Print oUserInfo.Name & ", " & oUserData.Age高级用法:客户端会话数据
Private Type tSessionData
LoginTime As Date
LastActivity As Date
LoginAttempts As Long
Authenticated As Boolean
End Type
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
Dim tSession As tSessionData
tSession.LoginTime = Now
tSession.LastActivity = Now
tSession.LoginAttempts = 0
tSession.Authenticated = False
Client.UserData = tSession
End Sub
Private Sub CheckSessionTimeout()
Dim oClient As cWinsock
Dim tSession As tSessionData
For Each oClient In m_oServer.Clients
tSession = oClient.UserData
If DateDiff("s", tSession.LastActivity, Now) > 300 Then ' 5 分钟无活动
Debug.Print "会话超时,断开: " & oClient.Tag
oClient.Close_
End If
Next
End Sub🔑 SocketHandle 属性
说明
获取底层的 Socket 句柄(只读)。
语法
Property Get SocketHandle() As Long使用示例
' 获取 Socket 句柄
Debug.Print "Socket 句柄: " & m_oSocket.SocketHandle
' 用于高级操作(如与 Win32 API 交互)
If m_oSocket.SocketHandle <> 0 Then
Call SomeWin32Function(m_oSocket.SocketHandle)
End If📊 BytesReceived 属性
说明
获取接收缓冲区中可用的字节数(只读)。
语法
Property Get BytesReceived() As Long使用示例
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Debug.Print "事件通知: " & bytesTotal & " 字节"
Debug.Print "缓冲区总计: " & Client.BytesReceived & " 字节"
' 只读取部分数据
If Client.BytesReceived > 100 Then
Dim sData As String
Client.GetData sData, vbString, 100 ' 只读取前 100 字节
Debug.Print "读取了部分数据: " & sData
End If
End Sub🏢 IsServer 属性
说明
判断当前对象是否为服务器模式(只读)。
语法
Property Get IsServer() As Boolean使用示例
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
If Client.IsServer Then
Debug.Print "来自服务器的数据"
Else
Debug.Print "来自客户端的数据"
End If
End Sub🔗 IsAcceptedClient 属性
说明
判断当前对象是否为服务器接受的客户端(只读)。
语法
Property Get IsAcceptedClient() As Boolean使用示例
Private Sub SomeFunction(oSocket As cWinsock)
If oSocket.IsAcceptedClient Then
Debug.Print "这是服务器接受的客户端"
Debug.Print "父服务器: " & oSocket.ParentServer.Tag
Else
Debug.Print "这是独立客户端或服务器对象"
End If
End Sub👆 ParentServer 属性
说明
获取父服务器对象(仅对服务器接受的客户端有效)。
语法
Property Get ParentServer() As cWinsock使用示例
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
' 服务器设置 ParentServer
' 客户端可以访问父服务器
Debug.Print "新客户端的父服务器: " & Client.ParentServer.Tag
End Sub高级用法:客户端广播消息
' 在某个客户端的事件中,通过父服务器向其他客户端广播
Private Sub ClientBroadcastToOthers(ByVal oSender As cWinsock, ByVal sMessage As String)
Dim oClient As cWinsock
For Each oClient In oSender.ParentServer.Clients
If Not oClient Is oSender Then ' 不发送给自己
oClient.SendData sMessage
End If
Next
End Sub👥 Clients 属性
说明
获取所有连接的客户端集合(仅对服务器对象有效)。
语法
Property Get Clients() As Collection使用示例
' 遍历所有客户端
Private Sub ListAllClients()
Debug.Print "当前连接数: " & m_oServer.ClientCount
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
Debug.Print oClient.Tag & ": " & oClient.RemoteHostIP & ":" & oClient.RemotePort
Next
End Sub
' 查找特定客户端
Private Function FindClientByIP(ByVal sIP As String) As cWinsock
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
If oClient.RemoteHostIP = sIP Then
Set FindClientByIP = oClient
Exit Function
End If
Next
Set FindClientByIP = Nothing
End Function
' 向所有客户端广播
Private Sub BroadcastToAll(ByVal sMessage As String)
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
On Error Resume Next
oClient.SendData sMessage
On Error GoTo 0
Next
End Sub🔢 ClientCount 属性
说明
获取当前连接的客户端数量(只读,仅对服务器对象有效)。
语法
Property Get ClientCount() As Long使用示例
' 显示连接数
lblClientCount.Caption = "当前连接: " & m_oServer.ClientCount
' 限制最大连接数
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
If m_oServer.ClientCount >= m_lMaxClients Then
Debug.Print "达到最大连接数限制: " & m_lMaxClients
DisConnect = True
End If
End Sub👤 CurrentUser 属性
说明
获取或设置绑定的用户名(用于用户绑定功能)。当使用 BindUser 方法绑定用户后,该属性自动设置为用户名。
语法
Public CurrentUser As Variant使用示例
' 客户端连接时绑定用户
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
Client.GetData sData
If Left$(sData, 6) = "LOGIN:" Then
Dim sUsername As String
sUsername = Mid$(sData, 7)
' 绑定用户
m_oServer.BindUser sUsername, Client
' 验证绑定成功
Debug.Print "Client.CurrentUser = " & Client.CurrentUser
End If
End Sub
' 检查用户是否已登录
Private Sub CheckUserLogin(ByVal oClient As cWinsock)
If LenB(CStr(oClient.CurrentUser)) = 0 Then
Debug.Print "用户未登录"
Else
Debug.Print "当前用户: " & oClient.CurrentUser
End If
End Sub与 Tag 属性的区别
| 属性 | 用途 | 设置方式 |
|---|---|---|
Tag | 标识 socket 连接(如 "#001") | 自动分配或手动设置 |
CurrentUser | 标识登录用户 | 通过 BindUser 绑定 |
自动清理
当客户端断开连接时(调用 Close_ 或对象销毁),系统会自动解绑用户,无需手动处理。
🔑 CurrentUserToken 属性
说明
获取或设置用户认证令牌(用于用户绑定功能)。当使用 BindUser 方法绑定用户时传入 Token 参数,该属性自动设置为对应值。
语法
Public CurrentUserToken As String使用示例
' 绑定用户时传入 Token
m_oServer.BindUser "alice", Client, "jwt_token_xyz123"
' 后续验证 Token
If Client.CurrentUserToken = "jwt_token_xyz123" Then
Debug.Print "Token 验证通过"
End If
' 获取当前用户的 Token
Debug.Print "用户 " & Client.CurrentUser & " 的 Token: " & Client.CurrentUserToken📋 CurrentUserInfo 属性
说明
获取或设置用户扩展信息(用于用户绑定功能)。当使用 BindUser 方法绑定用户时传入 Info 参数(cJson 对象),该属性自动设置为对应值。可用于存储用户的额外元数据,如登录时间、IP 地址、权限等级等。
语法
Public CurrentUserInfo As cJson使用示例
' 绑定用户时传入扩展信息
Dim oInfo As New cJson
oInfo.Add "loginTime", Now
oInfo.Add "ip", Client.RemoteHostIP
oInfo.Add "role", "admin"
m_oServer.BindUser "alice", Client, , oInfo
' 读取用户扩展信息
Debug.Print "登录时间: " & Client.CurrentUserInfo.Item("loginTime")
Debug.Print "角色: " & Client.CurrentUserInfo.Item("role")
' 动态添加信息
Client.CurrentUserInfo.Add "lastActivity", Now与 UserData 的区别
| 属性 | 用途 | 生命周期 |
|---|---|---|
UserData | 通用自定义数据存储 | 由用户手动管理 |
CurrentUserInfo | 用户绑定的结构化信息(JSON) | 随 BindUser/UnbindUser 自动管理 |
🔢 CountUsers 属性
说明
获取当前已绑定用户的数量(只读)。通过 BindUser 方法绑定的用户会计入此计数。
语法
Property Get CountUsers() As Long使用示例
' 显示当前绑定用户数
Debug.Print "当前绑定用户数: " & m_oServer.CountUsers
' 监控用户登录状态
Private Sub UpdateUserCount()
lblUserCount.Caption = "在线用户: " & m_oServer.CountUsers
End Sub
' 在 DataArrival 中检查
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Debug.Print "当前绑定用户总数: " & m_oServer.CountUsers
End Sub👥 CountGroups 属性
说明
获取当前已创建的组数量(只读)。通过 AddGroup 方法创建的组会计入此计数。
语法
Property Get CountGroups() As Long使用示例
' 显示当前组数量
Debug.Print "当前组数量: " & m_oServer.CountGroups
' 初始化时创建默认组
Private Sub InitializeGroups()
If m_oServer.CountGroups = 0 Then
m_oServer.AddGroup "Default"
m_oServer.AddGroup "Admins"
End If
End Sub📦 PacketHandler 属性
说明
获取或设置封包协议处理器对象。每个 cWinsock 实例持有独立的协议实例,多客户端互不干扰。
语法
Property Get PacketHandler() As cPacketProtocol
Property Set PacketHandler(ByVal Value As cPacketProtocol)使用示例
' 高级配置:直接操作协议对象
Dim oProtocol As cPacketProtocol
Set oProtocol = New cPacketProtocol
oProtocol.ProtocolType = ppLengthHeader
oProtocol.HeaderBytes = 4
oProtocol.Endian = eeBigEndian
Set m_oServer.PacketHandler = oProtocol📦 PacketProtocol 属性
说明
快速设置封包协议类型。设置后自动创建协议处理器(如果不存在)。设为 ppNone 则禁用协议。
语法
Property Get PacketProtocol() As PacketProtocolType
Property Let PacketProtocol(ByVal Value As PacketProtocolType)值
| 常量 | 值 | 说明 |
|---|---|---|
ppNone | 0 | 无协议(默认) |
ppDelimiter | 1 | 字符分隔符协议 |
ppFixedLength | 2 | 定长协议 |
ppLengthHeader | 3 | 长度头协议 |
使用示例
' 设置分隔符协议
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf
' 设置长度头协议
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderBytes = 4
' 禁用协议
m_oServer.PacketProtocol = ppNone📦 Delimiter 属性
说明
设置或获取字符分隔符协议的分隔符。默认为 vbCrLf。仅在 PacketProtocol = ppDelimiter 时有效。
语法
Property Get Delimiter() As String
Property Let Delimiter(ByVal Value As String)使用示例
' 使用换行符作为分隔符(适合文本行协议)
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf
' 使用空字符作为分隔符(适合二进制文本混合协议)
m_oServer.Delimiter = vbNullChar
' 使用自定义分隔符
m_oServer.Delimiter = "<EOF>"📦 FixedLength 属性
说明
设置或获取定长协议的消息长度。仅在 PacketProtocol = ppFixedLength 时有效。
语法
Property Get FixedLength() As Long
Property Let FixedLength(ByVal Value As Long)使用示例
' 每条消息固定 256 字节
m_oServer.PacketProtocol = ppFixedLength
m_oServer.FixedLength = 256📦 HeaderBytes 属性
说明
设置或获取长度头协议的头字节数。2 表示使用 Integer(最大 65535 字节),4 表示使用 Long。默认为 4。仅在 PacketProtocol = ppLengthHeader 时有效。
语法
Property Get HeaderBytes() As Long
Property Let HeaderBytes(ByVal Value As Long)值
| 值 | 说明 | 最大消息长度 |
|---|---|---|
| 2 | 2字节头(Unsigned Integer) | 65,535 字节 |
| 4 | 4字节头(Unsigned Long) | 2,147,483,647 字节 |
使用示例
' 小消息用2字节头节省带宽
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderBytes = 2
' 大消息用4字节头
m_oServer.HeaderBytes = 4📦 HeaderEndian 属性
说明
设置或获取长度头协议的字节序。默认为小端(eeLittleEndian)。仅在 PacketProtocol = ppLengthHeader 时有效。
语法
Property Get HeaderEndian() As EndianEnum
Property Let HeaderEndian(ByVal Value As EndianEnum)值
| 常量 | 值 | 说明 |
|---|---|---|
eeLittleEndian | 0 | 小端序(默认,x86/x64) |
eeBigEndian | 1 | 大端序(网络字节序) |
使用示例
' 与 Java/网络协议通信(通常用大端序)
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderEndian = eeBigEndian📦 MaxPacketSize 属性
说明
单包最大字节数限制。长度头协议解析时,如果声明的消息长度超过此值,直接报错丢弃。防止恶意超大包声明耗尽内存。
语法
Property Get MaxPacketSize() As Long
Property Let MaxPacketSize(ByVal Value As Long)默认值
1MB(1048576 字节)
使用示例
' 调整最大包限制
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.MaxPacketSize = 524288 ' 512KB
' 新客户端自动继承此配置注意事项
- 仅对
ppLengthHeader协议有效 - 超限时抛出明确错误信息
- 新客户端自动继承服务器的配置
📦 MaxBufferSize 属性
说明
接收缓冲区累积上限。Decode 合并缓冲区前检查,超过此值则报错丢弃。防止大量不完整包慢慢吃内存(如攻击者发送大量不完整包)。
语法
Property Get MaxBufferSize() As Long
Property Let MaxBufferSize(ByVal Value As Long)默认值
4MB(4194304 字节)
使用示例
' 调整缓冲区上限
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.MaxBufferSize = 8388608 ' 8MB注意事项
- 对所有协议类型有效
- 超限时抛出明确错误信息
- 新客户端自动继承服务器的配置
💓 Heartbeat 属性
说明
获取心跳管理器对象,用于高级配置。心跳管理器内嵌 cTimer 自动驱动,无需外部定时器。
语法
Property Get Heartbeat() As cHeartbeat使用示例
' 高级配置
If Not m_oServer.Heartbeat Is Nothing Then
Debug.Print "心跳已发送次数: " & m_oServer.Heartbeat.HeartbeatCount
Debug.Print "定时器间隔: " & m_oServer.Heartbeat.TimerInterval & "ms"
End If💓 AutoHeartbeat 属性
说明
启用或禁用自动心跳。启用后内嵌 cTimer 自动驱动,无需外部定时器或 PollHeartbeat() 调用。
语法
Property Get AutoHeartbeat() As Boolean
Property Let AutoHeartbeat(ByVal Value As Boolean)使用示例
' 服务端:启用心跳检测
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 120 ' 2分钟超时
' 客户端:启用心跳保活
m_oClient.AutoHeartbeat = True
m_oClient.HeartbeatInterval = 50 ' 50秒间隔
' 禁用心跳
m_oServer.AutoHeartbeat = False💓 HeartbeatTimeout 属性
说明
服务端心跳超时秒数。客户端空闲时间超过此值将被自动断开。默认 120 秒(2 分钟)。仅在服务器模式且 AutoHeartbeat = True 时有效。
语法
Property Get HeartbeatTimeout() As Long
Property Let HeartbeatTimeout(ByVal Value As Long)使用示例
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 180 ' 3分钟超时💓 HeartbeatInterval 属性
说明
客户端心跳间隔秒数。当空闲时间超过此值,客户端自动发送心跳包。默认 50 秒。仅在客户端模式且 AutoHeartbeat = True 时有效。
语法
Property Get HeartbeatInterval() As Long
Property Let HeartbeatInterval(ByVal Value As Long)使用示例
m_oClient.AutoHeartbeat = True
m_oClient.HeartbeatInterval = 30 ' 30秒无活动则发心跳💓 HeartbeatData 属性
说明
心跳包内容(字节数组)。默认为单字节 &H00。可根据协议自定义心跳包格式。
语法
Property Get HeartbeatData() As Byte()
Property Let HeartbeatData(ByRef Value() As Byte)使用示例
' 自定义心跳包内容
Dim baHB(0 To 3) As Byte
baHB(0) = &HFF
baHB(1) = &H0
baHB(2) = &H0
baHB(3) = &HFF
m_oClient.HeartbeatData = baHB💓 IdleSeconds 属性
说明
当前连接的空闲秒数(只读)。从最后一次收发数据开始计算。可用于判断连接活跃度。
语法
Property Get IdleSeconds() As Long使用示例
' 检查客户端活跃度
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
Debug.Print oClient.Tag & " 空闲: " & oClient.IdleSeconds & "秒"
Next📌 属性使用场景总结
客户端常用属性
' 连接前设置
m_oClient.Protocol = sckTCPProtocol
m_oClient.RemoteHost = "192.168.1.100"
m_oClient.RemotePort = 8080
m_oClient.Connect
' 连接后获取
Debug.Print "IP: " & m_oClient.RemoteHostIP
Debug.Print "端口: " & m_oClient.RemotePort
Debug.Print "状态: " & m_oClient.State
' 自定义标签
m_oClient.Tag = "客户端-001"
m_oClient.UserData = "用户信息"服务器常用属性
' 启动服务器
m_oServer.Protocol = sckTCPProtocol
m_oServer.LocalPort = 8080
m_oServer.Listen
' 设置封包协议
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf
' 设置心跳
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 120
' 管理客户端
Debug.Print "连接数: " & m_oServer.ClientCount
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
Debug.Print oClient.Tag & ": " & oClient.RemoteHostIP & " (空闲" & oClient.IdleSeconds & "秒)"
oClient.SendData "广播消息"
Next最后更新: 2026-06-09