MQTT程序_客户端和服务端
服务端
| using System; |
| using System.Net; |
| using System.Threading.Tasks; |
| using DotNetty.Buffers; |
| using DotNetty.Channel; |
| using DotNetty.Channel.Sockets; |
| using DotNetty.Handlers.Logging; |
| using DotNetty.Transport.Tcp; |
| |
| class MqttServer |
| { |
| static async Task Main(string[] args) |
| { |
| |
| var bootstrap = new ServerBootstrap(); |
| |
| |
| bootstrap.Group(new MultithreadEventLoopGroup()) |
| .Channel<TcpServerSocket>() |
| .LocalAddress(IPAddress.Any, 1883) |
| .Handler(new LoggingHandler("server")) |
| .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => |
| { |
| |
| channel.Pipeline.AddLast(new MqttDecoder()); |
| channel.Pipeline.AddLast(new MqttEncoder()); |
| |
| |
| channel.Pipeline.AddLast(new MqttServerHandler()); |
| })); |
| |
| |
| await bootstrap.BindAsync(); |
| |
| |
| Console.WriteLine("MQTT Server started at port 1883"); |
| await Task.Delay(int.MaxValue); |
| } |
| } |
| |
| class MqttServerHandler : ChannelHandlerAdapter |
| { |
| public override void ChannelRead(IChannelHandlerContext context, object message) |
| { |
| |
| context.WriteAsync(message); |
| } |
| } |
客户端
| using System; |
| using System.Net; |
| using System.Threading.Tasks; |
| using DotNetty.Buffers; |
| using DotNetty.Channel; |
| using DotNetty.Channel.Sockets; |
| using DotNetty.Handlers.Logging; |
| using DotNetty.Transport.Tcp; |
| |
| class MqttClient |
| { |
| static async Task Main(string[] args) |
| { |
| |
| var bootstrap = new Bootstrap(); |
| |
| |
| bootstrap.Group(new MultithreadEventLoopGroup()) |
| .Channel<TcpSocketChannel>() |
| .RemoteAddress(IPAddress.Loopback, 1883) |
| .Handler(new LoggingHandler("client")) |
| .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => |
| { |
| |
| channel.Pipeline.AddLast(new MqttDecoder()); |
| channel.Pipeline.AddLast(new MqttEncoder()); |
| |
| |
| channel.Pipeline.AddLast(new MqttClientHandler()); |
| })); |
| |
| |
| await bootstrap.ConnectAsync(); |
| |
| |
| await channel.WriteAsync(new MqttApplicationMessage |
| { |
| Topic = "topic/test", |
| Payload = Encoding.UTF8.GetBytes("Hello, world!") |
| }); |
| |
| |
| await channel.WriteAsync(new MqttSubscribeMessage |
| { |
| Topics = new[] { new MqttTopicFilter { Topic = "topic/test" } } |
| }); |
| |
| |
| while (true) |
| { |
| var message = await channel.ReadAsync(); |
| |
| Console.WriteLine(message.Topic); |
| Console.WriteLine(Encoding.UTF8.GetString(message.Payload)); |
| } |
| } |
| } |
| |
| class MqttClientHandler : ChannelHandlerAdapter |
| { |
| public override void ChannelRead(IChannelHandlerContext context, object message) |
| { |
| |
| context.WriteAsync(message); |
| } |
| } |
| |
该程序的功能如下:
- 服务端监听 TCP 端口 1883,等待客户端连接。
- 客户端连接到服务端后,可以发布消息和订阅主题。
- 服务端将接收到的消息转发给所有订阅该主题的客户端。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现