墨迹南北 發表於 2021-1-30 12:10:00

mqtt打造消息聊天软件

<p><strong>mqtt打造消息聊天软件</strong></p>
<p>基于mqtt打造消息聊天软件,非常简单而适用。比传统的基于tcp\websocket socket打造要省事得多。</p>
<p>mqtt是典型的<strong>发布(</strong><strong>pub</strong><strong>)\</strong><strong>订阅(sub</strong><strong>)</strong>消息模式。</p>
<p>mqtt server就用现成的,无须自己打造,以<strong>Mosquitto</strong>为例</p>
<p>https://www.cnblogs.com/hnxxcxg/p/12393808.html</p>
<p>mqtt client使用tms mqtt client控件</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">/// &lt;author&gt;cxg 2021-1-30&lt;/author&gt;

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&lt;System.Byte&gt;);
    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&lt;System.Byte&gt;);
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 &gt; 0 then
    for var i: Integer := 0 to fMsgs.Count - 1 do
      Memo1.Lines.Add(fMsgs);
    fMsgs.Clear;
end;

end.
</pre>
</div>
<p>  </p>
<p><strong>消息质量说明</strong></p>
<p>TTMSMQTTQoS = (</p>
<p>&gt; / / / &lt;总结&nbsp;</p>
<p>///最多一次交付&nbsp;</p>
<p>/ / / &lt; /总结&gt;&nbsp;</p>
<p>qosAtMostOnce = 0,&nbsp;</p>
<p>&gt; / / / &lt;总结&nbsp;</p>
<p>///至少一次交付&nbsp;</p>
<p>/ / / &lt; /总结&gt;&nbsp;</p>
<p>qosAtLeastOnce = 1,</p>
<p>&gt; / / / &lt;总结&nbsp;</p>
<p>///精确一次交货&nbsp;</p>
<p>/ / / &lt; /总结&gt;&nbsp;</p>
<p>qosExactlyOnce = 2,&nbsp;</p>
<p>&gt; / / / &lt;总结&nbsp;</p>
<p>/// Forbidden -保留&nbsp;</p>
<p>/ / / &lt; /总结&gt;&nbsp;</p>
<p>qosRESERVED = 3);</p>
<p>&nbsp;</p>
<p><strong>mqtt client </strong><strong>既可以是消息的发布者,又可以是消息的订阅者</strong>。</p>
<p><strong>同一个mqtt client</strong><strong>可以同时订阅n</strong><strong>个主题的消息</strong>。</p>
<p>&nbsp;</p>
<p><strong>主题(topic</strong><strong>)</strong></p>
<p>不论是发布消息,还是订阅消息,都必须提供主题,也就是说主题是发布消息和订阅消息的唯一依据,没有主题,便不能发布和订阅消息。</p>
<p>以聊天软件为例,主题就是好友的id或已加入群的id</p>
<p>mqtt 客户端<br>-能被 VCL,FMX&nbsp;and&nbsp;LCL&nbsp;应用程序使用<br>-&nbsp;支持 Windows,&nbsp;iOS,&nbsp;Android,&nbsp;macOS,&nbsp;Linux,&nbsp;Raspberry&nbsp;Pi<br>不安装,直接引用源码单元使用,可支持10.4</p>
<p>支持DELPHI,LAZARUS开发</p>
<p>配合MSGPACK,BSON等序列,可发送&nbsp;文字、图片、文件、视频。。。</p>
<p>MQTT&nbsp;v3规范定义的允许的最大消息大小(256MB)。这已经能满足许多应用场合数据传输的要求。</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/14348621.html</p><br><br>
来源:https://www.cnblogs.com/hnxxcxg/p/14348621.html
頁: [1]
查看完整版本: mqtt打造消息聊天软件