zoukankan      html  css  js  c++  java
  • mqtt打造消息聊天软件

    mqtt打造消息聊天软件

    基于mqtt打造消息聊天软件,非常简单而适用。比传统的基于tcpwebsocket socket打造要省事得多。

    mqtt是典型的发布(pub订阅(sub消息模式。

    mqtt server就用现成的,无须自己打造,以Mosquitto为例

    https://www.cnblogs.com/hnxxcxg/p/12393808.html

    mqtt client使用tms mqtt client控件

    /// <author>cxg 2021-1-30</author>
    
    unit Unit2;
    
    interface
    
    uses
      TMS.MQTT.Global, TMS.MQTT.Client,
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
    
    type
      TForm2 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        fMsgs: TStringList;
        fclient: TTMSMQTTClient;   //既是发布者,又是订阅者
        procedure sub; //可订阅多个主题
        procedure Received(ASender: TObject; APacketID: Word; ATopic: string; APayload: TArray<System.Byte>);
        procedure ConnectedStatusChanged(ASender: TObject; const AConnected: Boolean; AStatus: TTMSMQTTConnectionStatus);
      public
        { Public declarations }
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    var topic: string = 'chat';  //主题
    
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      fclient.Publish(topic, '咏南中间件:' + Edit1.Text, qosExactlyOnce, False);  //发布消息
    end;
    
    procedure TForm2.ConnectedStatusChanged(ASender: TObject;
      const AConnected: Boolean; AStatus: TTMSMQTTConnectionStatus);
    begin
      case AStatus of
        csConnectionLost: ShowMessage('connection lost');
      end;
    end;
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      fMsgs := TStringList.Create;
      fclient := TTMSMQTTClient.Create(nil);
      fclient.BrokerHostName := '127.0.0.1';
      fclient.BrokerPort := 1883;
      fclient.OnConnectedStatusChanged := ConnectedStatusChanged;
      fclient.OnPublishReceived := Received;
      fclient.Connect();
      sub;
    end;
    
    procedure TForm2.FormDestroy(Sender: TObject);
    begin
      fclient.Free;
      fMsgs.Free;
    end;
    
    procedure TForm2.Received(ASender: TObject; APacketID: Word; ATopic: string;
      APayload: TArray<System.Byte>);
    begin
      fMsgs.Add(TEncoding.UTF8.GetString(APayload));
    end;
    
    procedure TForm2.sub;
    begin
      fclient.Subscribe(topic, qosExactlyOnce);
      fclient.Subscribe('topic', qosExactlyOnce);
    end;
    
    procedure TForm2.Timer1Timer(Sender: TObject);
    begin
      if fMsgs.Count > 0 then
        for var i: Integer := 0 to fMsgs.Count - 1 do
          Memo1.Lines.Add(fMsgs[i]);
        fMsgs.Clear;
    end;
    
    end.
    

      

    消息质量说明

    TTMSMQTTQoS = (

    > / / / <总结 

    ///最多一次交付 

    / / / < /总结> 

    qosAtMostOnce = 0, 

    > / / / <总结 

    ///至少一次交付 

    / / / < /总结> 

    qosAtLeastOnce = 1,

    > / / / <总结 

    ///精确一次交货 

    / / / < /总结> 

    qosExactlyOnce = 2, 

    > / / / <总结 

    /// Forbidden -保留 

    / / / < /总结> 

    qosRESERVED = 3);

    mqtt client 既可以是消息的发布者,又可以是消息的订阅者

    同一个mqtt client可以同时订阅n个主题的消息

    主题(topic

    不论是发布消息,还是订阅消息,都必须提供主题,也就是说主题是发布消息和订阅消息的唯一依据,没有主题,便不能发布和订阅消息。

    以聊天软件为例,主题就是好友的id或已加入群的id

    mqtt 客户端
    -能被 VCL,FMX and LCL 应用程序使用
    - 支持 Windows, iOS, Android, macOS, Linux, Raspberry Pi
    不安装,直接引用源码单元使用,可支持10.4

    支持DELPHI,LAZARUS开发

    配合MSGPACK,BSON等序列,可发送 文字、图片、文件、视频。。。

    MQTT v3规范定义的允许的最大消息大小(256MB)。这已经能满足许多应用场合数据传输的要求。

  • 相关阅读:
    web安全——代理(nginx)
    2016年3-7月书单推荐
    web安全——系统(Linux)
    web安全——防火墙
    web安全——简介
    系统安全扫描工具(appscan)的扫描类型小记
    知识管理,让生活更美好
    亚马逊如何变成 SOA(面向服务的架构)
    徐小平:关了公司以后,我有这些话要对你说
    网易味央第二座猪场落户江西 面积超过3300亩
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/14348621.html
Copyright © 2011-2022 走看看