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,等待客户端连接。
- 客户端连接到服务端后,可以发布消息和订阅主题。
- 服务端将接收到的消息转发给所有订阅该主题的客户端。