Skip to content

VBMAN WebSocket 双向通信示例

提示

本篇由ai根据vbman源码自动猜测,真实对象尚未发布。

概述

这个示例展示了如何使用 VBMAN 框架实现基于 WebSocket 协议的实时双向通信。相比 SSE,WebSocket 提供了真正的双向通信能力,客户端和服务器都可以主动发送数据。

项目结构

WebSocket/
  ├── server/              # WebSocket服务器
  │   ├── Form1.frm       # 服务器主窗体
  │   ├── WebSocket.vbp   # 服务器项目文件
  │   └── include/        # 服务器端类库
  │       ├── wsHandler.cls # WebSocket处理类
  │       └── wsAuth.cls   # WebSocket认证类
  └── client/             # WebSocket客户端
      ├── index.html     # 客户端页面
      └── js/           # 客户端脚本
          └── ws.js     # WebSocket客户端实现

核心代码解析

1. WebSocket服务器配置(Form1.frm)

vb
Dim WebSocketServer As New cWebsocketServer

Private Sub Form_Load()
    With WebSocketServer
        '注册事件处理程序
        .Router.Reg "WS", New wsHandler
        
        '配置认证中间件
        .Router.Before.Add "/*", New wsAuth
        
        '启动WebSocket服务器
        .Start 81
    End With
End Sub

'WebSocket客户端连接事件
Private Sub WebSocketServer_OnAccept(ClientInfo As cHttpServerClientInfo, Disconnect As Boolean)
    List1.AddItem Now() & " - 新连接: " & ClientInfo.IP & ":" & ClientInfo.Port
End Sub

'WebSocket数据到达事件
Private Sub WebSocketServer_OnDataArrival(Client As cWebsockerServerClient)  
    '获取消息内容
    Dim msg As String: msg = Client.ReceivedText
    
    '广播给所有客户端
    Client.Parent.Broadcast msg
    
    '添加到日志
    List1.AddItem Now() & " - 收到消息: " & msg
End Sub

2. WebSocket处理类(wsHandler.cls)

vb
Public Sub OnConnect(Client As cWebsockerServerClient)
    '连接建立时的处理
    With Client.NewJson
        .Item("type") = "welcome"
        .Item("time") = Now()
        .Item("msg") = "欢迎加入聊天室"
    End With
    Client.SendJson Client.Json
End Sub

Public Sub OnMessage(Client As cWebsockerServerClient)
    '处理接收到的消息
    Dim msg As String: msg = Client.ReceivedText
    
    '响应客户端
    With Client.NewJson
        .Item("type") = "reply"
        .Item("time") = Now()
        .Item("msg") = "服务器已收到: " & msg
    End With
    Client.SendJson Client.Json
End Sub

Public Sub OnClose(Client As cWebsockerServerClient)
    '连接关闭时的处理
    Client.Parent.Broadcast "用户离开: " & Client.ClientInfo.IP
End Sub

3. WebSocket认证中间件(wsAuth.cls)

vb
Public Sub Execute(Client As cWebsockerServerClient)
    '获取认证信息
    Dim token As String: token = Client.Request.Headers("Sec-WebSocket-Protocol")
    
    '验证失败时关闭连接
    If Not IsValidToken(token) Then
        Client.Close
        Exit Sub
    End If
End Sub

4. WebSocket客户端实现(ws.js)

javascript
class ChatClient {
    constructor() {
        // 创建WebSocket连接
        this.ws = new WebSocket('ws://localhost:81');
        
        // 绑定事件处理
        this.ws.onopen = this.handleOpen.bind(this);
        this.ws.onmessage = this.handleMessage.bind(this);
        this.ws.onclose = this.handleClose.bind(this);
        this.ws.onerror = this.handleError.bind(this);
    }
    
    handleOpen(e) {
        console.log('WebSocket连接已建立');
        this.send({type: 'login', user: this.username});
    }
    
    handleMessage(e) {
        const data = JSON.parse(e.data);
        switch(data.type) {
            case 'welcome':
                this.showWelcome(data);
                break;
            case 'message':
                this.showMessage(data);
                break;
            case 'users':
                this.updateUsers(data.users);
                break;
        }
    }
    
    handleClose() {
        console.log('WebSocket连接已关闭');
    }
    
    handleError(e) {
        console.error('WebSocket错误:', e);
    }
    
    send(data) {
        this.ws.send(JSON.stringify(data));
    }
}

功能说明

  1. WebSocket服务器功能

    • 支持多客户端连接
    • 支持消息广播
    • 支持私聊消息
    • 支持自定义协议
  2. 消息处理功能

    • JSON格式消息
    • 消息类型识别
    • 消息路由分发
    • 错误处理机制
  3. 认证与安全

    • 连接认证
    • 心跳检测
    • 断线重连
    • 安全传输

技术要点

  1. WebSocket协议实现
  2. 双向通信机制
  3. 消息广播系统
  4. 认证中间件

应用场景

  1. 在线聊天室
  2. 游戏服务器
  3. 协同编辑
  4. 实时通知

扩展建议

  1. 添加消息压缩
  2. 实现分组广播
  3. 添加离线消息
  4. 实现消息持久化
  5. 添加集群支持

基于 VB6组件 发布