本文作者:icy

Delphi-TMS FNC WebSocket-跨平台WebSocket解决方案

icy 06-30 55 抢沙发
Delphi-TMS FNC WebSocket-跨平台WebSocket解决方案摘要: TMS FNC WebSocket:跨平台WebSocket解决方案详解 TMS FNC WebSocket是一个强大的跨平台组件,专为Delphi和Lazarus开发者设计,用于...

Delphi-TMS FNC WebSocket-跨平台WebSocket解决方案

TMS FNC WebSocket:跨平台WebSocket解决方案详解

TMS FNC WebSocket是一个强大的跨平台组件,专为Delphi和Lazarus开发者设计,用于简化WebSocket通信的实现。作为TMS FNC(Flexible Native Components)套件的一部分,它提供了一套统一的API,允许开发者在Windows、macOS、Linux、iOS和Android等多个平台上构建实时通信应用。本文将全面介绍TMS FNC WebSocket的特性、架构、使用方法以及实际应用场景。

TMS FNC WebSocket概述

TMS FNC WebSocket是一个专业级的跨平台WebSocket组件,它为Delphi和Lazarus开发者提供了实现实时双向通信的能力。作为TMS Software公司FNC(Flexible Native Components)系列的一部分,它继承了FNC组件的一贯特点:跨平台兼容性统一API设计高性能实现

WebSocket协议本身是一种在单个TCP连接上进行全双工通信的协议,于2011年被IETF定为标准RFC 6455。与传统的HTTP协议相比,WebSocket最大的优势在于它允许服务端主动向客户端推送数据,而不需要客户端不断轮询服务器。TMS FNC WebSocket封装了这一协议的复杂性,使开发者能够专注于业务逻辑的实现。

该组件支持所有主流的Delphi版本(包括社区版)和Lazarus IDE,可以无缝集成到现有的Delphi/Lazarus项目中。其设计哲学是”一次编写,多平台部署”,这意味着开发者可以使用相同的代码基础为Windows、macOS、Linux、iOS和Android等多个平台构建应用。

核心特性与技术优势

TMS FNC WebSocket组件具备一系列强大的特性,使其成为Delphi/Lazarus开发者实现实时通信的理想选择:

  1. 全平台支持:支持Windows、macOS、Linux桌面系统,以及iOS和Android移动平台,真正实现跨平台开发。

  2. 协议完整性:完整实现了RFC 6455 WebSocket协议标准,包括握手、数据帧处理、ping/pong心跳机制和连接关闭等所有必要功能。

  3. 二进制与文本支持:不仅支持文本消息传输,还能高效处理二进制数据,适合多媒体传输或自定义协议实现。

  4. SSL/TLS加密:内置支持wss://安全连接,确保通信数据加密传输,满足企业级安全需求。

  5. 自动重连机制:当连接意外中断时,组件可配置为自动尝试重新连接,提高应用可靠性。

  6. 心跳检测:支持可配置的心跳(ping/pong)机制,保持连接活跃并检测连接状态。

  7. 多线程安全:内部实现了线程安全机制,允许在后台线程中进行网络操作而不阻塞UI。

  8. 事件驱动架构:提供丰富的回调事件(onOpen, onMessage, onError, onClose等),简化异步编程模型。

与原生WebSocket API相比,TMS FNC WebSocket的最大优势在于其跨平台一致性开发效率。开发者无需为不同平台编写特定代码,也无需深入理解底层协议细节,即可快速构建高性能的实时通信功能。

架构与工作原理

TMS FNC WebSocket的架构设计遵循了现代网络组件的分层原则,在保持高性能的同时提供了简洁的API接口。理解其内部架构有助于开发者更有效地利用该组件。

核心架构层次

  1. 平台抽象层:这是最底层,负责处理不同操作系统和平台的网络API差异。在Windows上可能使用WinHTTP或WinSock,在Unix-like系统上使用BSD Socket,而在移动平台则使用平台特定的网络栈。这一层确保了上层代码的平台无关性。

  2. 协议实现层:实现了WebSocket协议的核心功能,包括:

    • 握手过程处理(HTTP升级请求和响应)

    • 数据帧的构造与解析(包括文本帧、二进制帧、控制帧等)

    • 掩码处理(客户端到服务器的消息必须掩码)

    • 心跳(ping/pong)机制

    • 连接关闭握手

  3. 连接管理层:维护WebSocket连接状态,处理自动重连逻辑,管理消息队列,以及提供线程安全机制。

  4. API接口层:暴露给开发者的Delphi/Lazarus组件接口,包括属性、方法和事件。这一层设计遵循Delphi的惯用模式,使熟悉VCL/FMX的开发者能够快速上手。

工作原理流程

  1. 初始化阶段:开发者创建TTMSFNCWebSocket组件实例,设置URL(ws://或wss://)、端口和其他可选参数。

  2. 连接建立:调用Connect方法后,组件内部:

    • 创建底层socket连接

    • 发送HTTP Upgrade请求(包含必要的WebSocket头信息如Sec-WebSocket-Key等)

    • 验证服务器响应(检查状态码101和Sec-WebSocket-Accept)

    • 触发OnOpen事件表示连接成功

  3. 数据传输:连接建立后,双方可以通过Send方法发送消息,接收到的消息会通过OnMessage事件回调。消息可以是文本或二进制格式。

  4. 连接维护:组件内部会自动处理ping/pong帧以保持连接活跃,也可配置自动重连逻辑。

  5. 连接终止:当调用Close方法或连接意外中断时,组件会执行标准的关闭握手(如可能)并触发OnClose事件。

TMS FNC WebSocket在设计上充分考虑了资源效率性能。它使用非阻塞I/O模型,在大多数平台上避免了创建额外线程的开销,而是依赖平台的异步I/O机制。对于消息处理等耗时操作,开发者可以选择在后台线程中执行以防止UI冻结。

使用指南与代码示例

掌握TMS FNC WebSocket的基本使用方法对于快速开发实时应用至关重要。本节将详细介绍如何在不同场景下使用该组件,并提供实用的代码示例。

基本配置与连接建立

首先需要在Delphi或Lazarus的表单或数据模块上放置TTMSFNCWebSocket组件。可以通过IDE的组件面板添加,或者运行时动态创建:

// 动态创建WebSocket实例
var
  WS: TTMSFNCWebSocket;
begin
  WS := TTMSFNCWebSocket.Create(Self);
  WS.URL := 'ws://echo.websocket.org';
  WS.Port := 80;
  // 设置其他属性...
end;

建立连接的基本步骤:

  1. 设置URL属性,指定WebSocket服务器地址(以ws://或wss://开头)

  2. 可选设置Port属性(默认为80/ws或443/wss)

  3. 设置其他可选参数如心跳间隔、自动重连等

  4. 调用Connect方法发起连接

// 配置并连接WebSocket
TMSFNCWebSocket1.URL := 'wss://myserver.com/chat';
TMSFNCWebSocket1.Port := 443;
TMSFNCWebSocket1.HeartbeatInterval := 30000; // 30秒心跳
TMSFNCWebSocket1.AutoReconnect := True; // 启用自动重连
TMSFNCWebSocket1.Connect;

事件处理

TMS FNC WebSocket采用事件驱动模型,主要事件包括:

  • OnOpen:连接成功建立时触发

  • OnMessage:接收到消息时触发

  • OnError:发生错误时触发

  • OnClose:连接关闭时触发

// 事件处理示例
procedure TForm1.TMSFNCWebSocket1Open(Sender: TObject);
begin
  Log('连接已建立');
  // 连接成功后发送欢迎消息
  TMSFNCWebSocket1.Send('Hello Server!');
end;

procedure TForm1.TMSFNCWebSocket1Message(Sender: TObject; const Text: string);
begin
  Log('收到文本消息: ' + Text);
end;

procedure TForm1.TMSFNCWebSocket1BinaryMessage(Sender: TObject; const Data: TArray<System.Byte>);
begin
  Log('收到二进制消息,长度: ' + Length(Data).ToString);
end;

procedure TForm1.TMSFNCWebSocket1Error(Sender: TObject; const Error: string);
begin
  Log('错误: ' + Error);
end;

procedure TForm1.TMSFNCWebSocket1Close(Sender: TObject);
begin
  Log('连接已关闭');
end;

消息发送

TMS FNC WebSocket支持发送文本和二进制消息:

// 发送文本消息
TMSFNCWebSocket1.Send('这是一条文本消息');

// 发送二进制消息
var
  BinaryData: TArray<System.Byte>;
begin
  SetLength(BinaryData, 4);
  BinaryData[0] := $01;
  BinaryData[1] := $02;
  BinaryData[2] := $03;
  BinaryData[3] := $04;
  TMSFNCWebSocket1.Send(BinaryData);
end;

高级功能实现

JSON消息处理:在实际应用中,JSON是常用的数据交换格式。

// 发送JSON消息
var
  JSON: TJSONObject;
begin
  JSON := TJSONObject.Create;
  try
    JSON.AddPair('action', 'login');
    JSON.AddPair('username', 'user1');
    JSON.AddPair('password', 'pass123');
    TMSFNCWebSocket1.Send(JSON.ToString);
  finally
    JSON.Free;
  end;
end;

// 接收并解析JSON消息
procedure TForm1.TMSFNCWebSocket1Message(Sender: TObject; const Text: string);
var
  JSON: TJSONObject;
  Action: string;
begin
  JSON := TJSONObject.ParseJSONValue(Text) as TJSONObject;
  if JSON <> nil then
  try
    Action := JSON.GetValue<string>('action');
    if Action = 'update' then
      HandleUpdate(JSON.GetValue<string>('data'));
  finally
    JSON.Free;
  end;
end;

二进制协议实现:对于性能敏感的应用,可以使用自定义二进制协议。

// 定义简单的二进制协议
procedure SendCommand(ACommand: Byte; AData: TBytes);
var
  Buffer: TArray<System.Byte>;
begin
  SetLength(Buffer, 1 + Length(AData));
  Buffer[0] := ACommand;
  if Length(AData) > 0 then
    Move(AData[0], Buffer[1], Length(AData));
  TMSFNCWebSocket1.Send(Buffer);
end;

// 解析二进制消息
procedure TForm1.TMSFNCWebSocket1BinaryMessage(Sender: TObject; const Data: TArray<System.Byte>);
var
  Command: Byte;
begin
  if Length(Data) < 1 then Exit;

  Command := Data[0];
  case Command of
    $01: HandleCommand1(Copy(Data, 1, Length(Data)-1);
    $02: HandleCommand2(Copy(Data, 1, Length(Data)-1);
  end;
end;

最佳实践建议

  1. 连接管理:实现适当的连接状态检查和重连逻辑,特别是在移动应用中网络可能不稳定的情况下。

  2. 错误处理:妥善处理OnError事件,记录错误信息并采取适当的恢复措施。

  3. 消息处理:对于复杂的应用,考虑实现消息队列和工作者线程来处理接收到的消息,避免阻塞主线程。

  4. 资源清理:在窗体或数据模块销毁时确保断开WebSocket连接并释放资源。

  5. 安全性:使用wss://而非ws://,特别是在传输敏感数据时;考虑实现应用层的身份验证和加密。

实际应用场景

TMS FNC WebSocket凭借其跨平台特性和强大的实时通信能力,适用于多种需要即时数据交换的应用场景。以下是几个典型的应用案例:

实时聊天应用

WebSocket技术最初就是为了解决实时聊天需求而设计的。使用TMS FNC WebSocket可以轻松构建跨平台的聊天应用:

  1. 私聊与群聊:实现用户间的实时文本、图片或文件传输

  2. 在线状态:实时显示联系人在线/离线状态

  3. 消息回执:通过WebSocket双向通信实现消息已读/送达回执

  4. 多设备同步:同一账号在多设备上实时同步聊天记录

// 聊天应用示例代码
procedure TChatForm.SendMessage(const AReceiver, AMessage: string);
var
  Msg: TJSONObject;
begin
  Msg := TJSONObject.Create;
  try
    Msg.AddPair('type', 'chat');
    Msg.AddPair('to', AReceiver);
    Msg.AddPair('content', AMessage);
    Msg.AddPair('timestamp', FormatDateTime('yyyy-mm-dd hh:nn:ss', Now));
    WebSocket.Send(Msg.ToString);
  finally
    Msg.Free;
  end;
end;

金融交易与行情系统

金融行业对实时数据有极高要求,TMS FNC WebSocket非常适合这类应用:

  1. 实时行情推送:股票、外汇、加密货币的实时价格变动

  2. 交易指令执行:快速传递买卖指令并获取执行结果

  3. 账户余额更新:实时反映账户资金和持仓变化

  4. 市场警报:价格达到预设条件时立即通知客户端

// 处理实时行情数据
procedure TTraderForm.WebSocketBinaryMessage(Sender: TObject; const Data: TArray<System.Byte>);
var
  Symbol: string;
  Price: Double;
begin
  if ParseMarketData(Data, Symbol, Price) then
  begin
    UpdatePriceGrid(Symbol, Price);
    CheckAlerts(Symbol, Price);
  end;
end;

物联网(IoT)监控系统

物联网设备通常需要与服务器保持持久连接,实时上报数据:

  1. 设备监控:实时显示传感器数据(温度、湿度、压力等)

  2. 远程控制:向设备发送控制指令并立即获取响应

  3. 异常警报:设备异常时立即通知监控中心

  4. 固件升级:通过二进制消息推送固件更新

// IoT设备数据处// 聊天应用示例代码
procedure TChatForm.SendMessage(const AReceiver, AMessage: string);
var
  Msg: TJSONObject;
begin
  Msg := TJSONObject.Create;
  try
    Msg.AddPair('type', 'chat');
    Msg.AddPair('to', AReceiver);
    Msg.AddPair('content', AMessage);
    Msg.AddPair('timestamp', FormatDateTime('yyyy-mm-dd hh:nn:ss', Now));
    WebSocket.Send(Msg.ToString);
  finally
    Msg.Free;
  end;
end;

金融交易与行情系统

金融行业对实时数据有极高要求,TMS FNC WebSocket非常适合这类应用:

  1. 实时行情推送:股票、外汇、加密货币的实时价格变动

  2. 交易指令执行:快速传递买卖指令并获取执行结果

  3. 账户余额更新:实时反映账户资金和持仓变化

  4. 市场警报:价格达到预设条件时立即通知客户端

// 处理实时行情数据

procedure TTraderForm.WebSocketBinaryMessage(Sender: TObject; const Data: TArray<System.Byte>);
var
  Symbol: string;
  Price: Double;
begin
  if ParseMarketData(Data, Symbol, Price) then
  begin
    UpdatePriceGrid(Symbol, Price);
    CheckAlerts(Symbol, Price);
  end;
end;


物联网(IoT)监控系统

物联网设备通常需要与服务器保持持久连接,实时上报数据:

  1. 设备监控:实时显示传感器数据(温度、湿度、压力等)

  2. 远程控制:向设备发送控制指令并立即获取响应

  3. 异常警报:设备异常时立即通知监控中心

  4. 固件升级:通过二进制消息推送固件更新

// IoT设备数据处理
procedure TIoTMonitorForm.WebSocketMessage(Sender: TObject; const Text: string);
var
  Data: TJSONObject;
  DeviceID, Status: string;
  Values: TJSONArray;
begin
  Data := TJSONObject.ParseJSONValue(Text) as TJSONObject;
  if Data <> nil then
  try
    DeviceID := Data.GetValue<string>('device_id');
    Status := Data.GetValue<string>('status');
    Values := Data.GetValue<TJSONArray>('values');

    UpdateDeviceStatus(DeviceID, Status, Values);
  finally
    Data.Free;
  end;
end;

多人在线游戏

实时多人游戏需要极低的通信延迟和频繁的状态同步:

  1. 玩家位置同步:实时更新所有玩家的位置和动作

  2. 游戏状态广播:向所有玩家同步游戏全局状态

  3. 即时消息聊天:游戏内玩家间的实时交流

  4. 比赛结果通知:比赛结束时立即通知所有参与者

// 游戏状态同步
procedure TGameClient.SyncGameState(const StateData: TBytes);
var
  Parser: TGameStateParser;
begin
  Parser := TGameStateParser.Create(StateData);
  try
    UpdatePlayerPositions(Parser.Players);
    UpdateGameObjects(Parser.Objects);
    UpdateScores(Parser.Scores);
  finally
    Parser.Free;
  end;
end;

协同编辑工具

类似Google Docs的实时协作编辑工具:

  1. 内容同步:实时同步所有协作者的编辑内容

  2. 光标位置显示:显示其他协作者的当前位置和选择

  3. 编辑冲突解决:处理多人同时编辑同一内容的情况

  4. 历史版本:通过WebSocket同步编辑历史

// 处理协同编辑操作
procedure TEditorForm.ProcessEditOperation(const OpJSON: string);
var
  Op: TEditOperation;
begin
  Op := TEditOperation.FromJSON(OpJSON);
  try
    if Op.Author <> CurrentUser then
      ApplyRemoteEdit(Op);
  finally
    Op.Free;
  end;
end;

实时数据分析与监控

需要实时可视化数据的场景:

  1. 业务仪表盘:实时显示KPI和业务指标

  2. 网络监控:实时反映网络状态和性能指标

  3. 工业控制系统:监控生产线实时状态

  4. 交通管理系统:实时显示交通流量和事件

// 更新实时图表
procedure TDashboardForm.UpdateRealtimeChart(const DataPoints: TArray<Double>);
begin
  Series1.BeginUpdate;
  try
    Series1.Clear;
    for var I := 0 to High(DataPoints) do
      Series1.Add(DataPoints[I]);
  finally
    Series1.EndUpdate;
  end;
  Chart1.Refresh;
end;

这些应用场景展示了TMS FNC WebSocket的多功能性。无论是消费级应用还是企业级系统,只要需要实时数据传输,都可以考虑使用这一技术。其跨平台特性尤其适合需要同时支持桌面和移动设备的解决方案。

性能优化与安全实践

要构建高效、可靠的TMS FNC WebSocket应用,必须关注性能优化和安全实践。本节将深入探讨提升WebSocket应用性能的方法和确保通信安全的最佳实践。

性能优化策略

  1. 消息压缩:对于文本消息特别是JSON数据,在应用层实现压缩可以显著减少带宽使用:

   // 使用ZLib压缩消息示例
   function CompressMessage(const Msg: string): TBytes;
   var
     Compressor: TZCompressionStream;
     InputStream: TBytesStream;
     OutputStream: TBytesStream;
   begin
     InputStream := TBytesStream.Create(TEncoding.UTF8.GetBytes(Msg));
     OutputStream := TBytesStream.Create;
     try
       Compressor := TZCompressionStream.Create(OutputStream);
       try
         Compressor.CopyFrom(InputStream, InputStream.Size);
       finally
         Compressor.Free;
       end;
       Result := Copy(OutputStream.Bytes, 0, OutputStream.Size);
     finally
       InputStream.Free;
       OutputStream.Free;
     end;
   end;
  1. 二进制协议设计:相比文本协议,自定义二进制协议通常更高效:

    • 使用固定长度的消息头包含消息类型和长度信息

    • 对数字使用二进制格式而非文本表示

    • 使用标记而不是键值对减少冗余数据

  2. 批处理消息:对于高频小消息,考虑实现批处理机制,将多个小消息合并为一个较大消息发送,减少协议开销。

  3. 消息优先级:区分关键消息和非关键消息,确保高优先级消息(如控制指令)能够及时发送,低优先级消息(如非关键状态更新)可以适当延迟或合并。

  4. 连接复用:对于需要与多个服务端点通信的应用,考虑在适当情况下复用WebSocket连接,而不是为每个功能创建独立连接。

安全最佳实践

  1. 始终使用WSS:在生产环境中始终使用wss://(WebSocket Secure)而非ws://,以防止中间人攻击和数据窃听。

  2. 身份验证:实现适当的身份验证机制,常见方法包括:

    • 令牌认证:在连接URL中包含认证令牌(如wss://example.com/chat?token=…)

    • 首消息认证:连接建立后第一个消息发送凭据

    • HTTP Cookie:利用WebSocket握手时的HTTP Cookie

   // 首消息认证示例
   procedure TForm1.WebSocketOpen(Sender: TObject);
   var
     AuthMsg: TJSONObject;
   begin
     AuthMsg := TJSONObject.Create;
     try
       AuthMsg.AddPair('action', 'authenticate');
       AuthMsg.AddPair('username', 'user1');
       AuthMsg.AddPair('password', 'securePass123');
       WebSocket.Send(AuthMsg.ToString);
     finally
       AuthMsg.Free;
     end;
   end;
  1. 输入验证:严格验证所有接收到的消息,防止注入攻击:

   procedure TForm1.ProcessIncomingMessage(const Msg: string);
   var
     JSON: TJSONObject;
     Command: string;
   begin
     if Msg.Length > MAX_MESSAGE_SIZE then
       raise Exception.Create('消息过长');
   
     try
       JSON := TJSONObject.ParseJSONValue(Msg) as TJSONObject;
       if JSON = nil then
         raise Exception.Create('无效的JSON格式');
   
       Command := JSON.GetValue<string>('command');
       if not IsValidCommand(Command) then
         raise Exception.Create('无效的命令');
   
       // 处理有效命令...
     finally
       JSON.Free;
     end;
   end;
  1. 速率限制:在客户端和服务器端都实现消息速率限制,防止滥用和拒绝服务攻击。

  2. 敏感数据保护:对于特别敏感的数据,即使在WSS连接上,也应考虑应用层加密:

   // 简单的应用层加密示例
   function EncryptMessage(const Msg, Key: string): string;
   begin
     // 使用安全的加密算法如AES加密消息
     Result := TAES.Encrypt(Msg, Key);
   end;

资源管理

  1. 连接生命周期:确保在窗体关闭、应用暂停(移动设备)等情况下正确关闭WebSocket连接,释放资源。

  2. 内存管理:对于大数据量的二进制消息,注意及时释放临时分配的内存,避免内存泄漏。

  3. 后台处理:对于耗时的消息处理操作,考虑使用后台线程或任务,避免阻塞主线程导致UI冻结。

监控与日志

  1. 连接状态监控:记录连接建立、关闭和错误事件,便于故障排查。

  2. 消息日志:在调试版本中记录收发消息的摘要信息(注意不要记录敏感数据)。

  3. 性能指标:跟踪消息延迟、吞吐量等关键指标,识别性能瓶颈。

跨平台注意事项

  1. 网络状态检测:在移动平台上,实现网络状态变化检测,在网络恢复时自动重新连接。

  2. 后台操作:了解不同移动平台对后台网络操作的限制,必要时使用平台特定的机制保持连接活跃。

  3. 证书处理:对于自签名证书或特殊证书需求,可能需要平台特定的处理方式。

通过实施这些性能优化和安全实践,可以确保TMS FNC WebSocket应用在各种环境下都能提供高效、可靠的实时通信能力,同时保护数据和系统安全。

与其他技术的比较与集成

在实际项目开发中,了解TMS FNC WebSocket与其他通信技术的差异以及如何将它们集成使用,对于设计健壮的分布式系统至关重要。本节将分析WebSocket与其他技术的对比,并探讨集成策略。

WebSocket与传统HTTP轮询对比

特性TMS FNC WebSocketHTTP轮询
通信模式全双工,双向实时通信半双工,客户端发起请求
连接开销一次握手,持久连接每次请求都需要完整HTTP握手
服务器推送原生支持模拟实现(长轮询)
延迟极低取决于轮询间隔
带宽效率高(仅少量帧头开销)低(每次请求都有完整HTTP头)
适用场景高频、低延迟的实时交互低频更新或不需实时性的数据获取
// HTTP轮询示例(对比用)
procedure TPollingClient.TimerPoll;
begin
  HTTP.Get('https://api.example.com/updates', procedure(AResponse: string; AError: string)
    begin
      if AError = '' then
        ProcessUpdates(AResponse);
    end);
end;

WebSocket与服务器发送事件(SSE)对比

特性TMS FNC WebSocketSSE (Server-Sent Events)
通信方向双向仅服务器到客户端
协议复杂度较高(二进制帧、掩码等)简单(纯文本)
浏览器支持广泛广泛(除IE/Edge旧版)
自动重连需手动实现内置支持
数据格式文本/二进制仅文本
适用场景需要双向交互的复杂应用只需服务器推送的简单场景

与消息队列(MQTT/AMQP)的集成

对于物联网或分布式系统,可以结合WebSocket和消息队列协议:

  1. 前端与中间层:使用TMS FNC WebSocket实现浏览器/客户端与中间层的实时通信

  2. 中间层与后端:中间层服务器通过MQTT/AMQP与后端消息代理通信

  3. 协议转换:中间层负责WebSocket与消息队列协议间的转换

// WebSocket服务器同时作为MQTT客户端示例
procedure TIntegrationModule.WebSocketMessage(Sender: TObject; const Text: string);
var
  JSON: TJSONObject;
  Topic: string;
begin
  // 将WebSocket消息转发到MQTT
  JSON := TJSONObject.ParseJSONValue(Text) as TJSONObject;
  if JSON <> nil then
  try
    Topic := JSON.GetValue<string>('topic');
    MQTTClient.Publish(Topic, JSON.GetValue<TJSONObject>('data').ToString);
  finally
    JSON.Free;
  end;
end;

procedure TIntegrationModule.MQTTMessageReceived(Sender: TObject; 
  const Topic, Payload: string);
begin
  // 将MQTT消息广播给所有WebSocket客户端
  WebSocketServer.Broadcast(
    TJSONObject.Create
      .AddPair('topic', Topic)
      .AddPair('data', TJSONObject.ParseJSONValue(Payload))
      .ToString);
end;

与REST API的协同使用

在实际系统中,WebSocket和REST API通常配合使用:

  1. 初始化数据:使用REST API获取初始状态或历史数据

  2. 实时更新:通过WebSocket接收实时变更通知

  3. 互补操作:非实时操作(如文件上传)使用REST,实时交互使用WebSocket

// 结合REST和WebSocket的示例
procedure TAppForm.FormCreate(Sender: TObject);
begin
  // 使用REST获取初始数据
  RESTClient.Get('/api/initialData', procedure(AResponse: string; AError: string)
    begin
      if AError = '' then
        LoadInitialData(AResponse);

      // 初始数据加载后建立WebSocket连接接收更新
      WebSocket.Connect;
    end);
end;

与GraphQL订阅的比较

GraphQL订阅提供了另一种实时数据获取方式:

特性TMS FNC WebSocketGraphQL订阅
协议WebSocket协议通常基于WebSocket传输GraphQL查询
数据查询能力需自定义协议强大的查询和过滤能力
适用场景通用实时通信需要复杂数据查询的实时应用
客户端复杂度较低(简单消息收发)较高(需处理GraphQL查询语言)

多协议架构建议

对于复杂的实时应用,可以考虑分层架构:

  1. 表现层:使用TMS FNC WebSocket直接与客户端通信,处理实时性要求高的交互

  2. 业务层:根据功能特点选择合适协议(REST/GraphQL/MQTT等)

  3. 集成层:负责不同协议间的转换和路由

  4. 数据层:标准化数据访问接口

这种架构既利用了WebSocket的实时性优势,又能够根据具体场景选择最合适的通信协议。

通过理解这些技术差异和集成模式,开发者可以设计出更加灵活、高效的分布式系统,充分发挥TMS FNC WebSocket在实时通信方面的优势,同时利用其他技术弥补其局限性。

TMS FNC WebSocket 1.0.4.4.zip
类型:压缩文件|已下载:1|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2025/06/57.html发布于 06-30
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,55人围观)参与讨论

还没有评论,来说两句吧...