21_MQTT协议_客户端和服务端

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,等待客户端连接。
  • 客户端连接到服务端后,可以发布消息和订阅主题。
  • 服务端将接收到的消息转发给所有订阅该主题的客户端。
posted @   甜饼怪2030  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示