mqtt打造消息聊天软件
mqtt打造消息聊天软件
基于mqtt打造消息聊天软件,非常简单而适用。比传统的基于tcp\websocket socket打造要省事得多。
mqtt是典型的发布(pub)\订阅(sub)消息模式。
mqtt server就用现成的,无须自己打造,以Mosquitto为例
https://www.cnblogs.com/hnxxcxg/p/12393808.html
mqtt client使用tms mqtt client控件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | /// <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)。这已经能满足许多应用场合数据传输的要求。
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/14348621.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2015-01-30 redis神器
2013-01-30 窗体自适应分辨率
2013-01-30 OleVariant的本质
2013-01-30 巢状对象提交数据的注意事项
2013-01-30 让delphi程序不受WINDOWS日期格式的影响
2013-01-30 断网收银数据同步方案