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  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示