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)。这已经能满足许多应用场合数据传输的要求。