基于Netty的UDP服务端开发

本文介绍如何使用Netty实现UDP服务,包括启动服务、数据预处理、登录鉴权及业务处理等关键步骤。

1.前言

之前基于Netty做了一套TCP与MQTT的服务端,随着系统接入的终端类型越来越多,出现了UDP通讯的设备,虽然这样的设备并非主流,而且通讯机制存在问题,为了考虑系统的兼容性,只能将整套服务做全。

2.UDP通讯优缺点

UDP 是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送数据。至于对方是否可以接收到这些数据,UDP 协议无法控制,所以说 UDP 是一种不可靠的协议。

UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。

与TCP 协议一样,UDP 协议直接位于 IP 协议之上。实际上,IP 协议属于 OSI 参考模型的网络层协议,而 UDP 协议和 TCP 协议都属于传输层协议。

因为 UDP 是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高,但也正因为如此,它的可靠性不如 TCP 协议。

UDP 协议的主要作用是完成网络数据流和数据报之间的转换在信息的发送端,UDP 协议将网络数据流封装成数据报,然后将数据报发送出去;在信息的接收端,UDP 协议将数据报转换成实际数据内容。

可以认为 UDP 协议的 socket 类似于码头,数据报则类似于集装箱。码头的作用就是负责友送、接收集装箱,而 socket 的作用则是发送、接收数据报。因此,对于基于 UDP 协议的通信双方而言,没有所谓的客户端和服务器端的概念。

3.源码示例

UDP的源码包含了我这边的整个系统架构层面的内容,并非完整的源码,可以根据自己的系统结构进行调整

3.1.启动UDP服务

/**
 * 网关数据监听
 * @author lenny
 * @date 20220314
 */
@Component
public class ApplicationEventListener implements CommandLineRunner {
    //因为我的网关服务是按终端协议节点进行区分的,当终端上下行数据都需要指定这个节点名称然后给到MQ
    @Value("${spring.application.name}")
    private String nodeName;
    //UDP服务的监听端口
    @Value("${gnss.udpserver.udpPort}")
    private int udpPort;

    @Override
    public void run(String... args) throws Exception {
        //启动UDP服务
        startUdpServer();

        //清除Redis所有此节点的在线终端(业务需要,Demo可以不用)
        RedisService redisService = SpringBeanService.getBean(RedisService.class);
        redisService.deleteAllOnlineTerminals(nodeName);

        //将所有此节点的终端设置为离线(业务需要,Demo可以不用)
        RabbitMessageSender messageSender = SpringBeanService.getBean(RabbitMessageSender.class);
        messageSender.noticeAllOffline(nodeName);
    }

    /**
     * 启动udp服务
     *
     * @throws Exception
     */
    private void startUdpServer() throws Exception {
        //计数器,必须等到所有服务启动成功才能进行后续的操作
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        //启动UDP服务
        UdpServer udpServer = new UdpServer(udpPort, ProtocolEnum.UDP, countDownLatch);
        udpServer.start();
        //等待启动完成
        countDownLatch.await();
    }
}

3.2.UdpServer类

/**
 * UDP服务类
 * @author lenny
 * @date 20220316
 */
@Slf4j
public class UdpServer extends Thread{
    private int port;

    private ProtocolEnum protocolType;

    private EventLoopGroup workerGroup;

    private Bootstrap bootstrap = new Bootstrap();

    private CountDownLatch countDownLatch;

    public UdpServer(int port, ProtocolEnum protocolType, CountDownLatch countDownLatch) {
        this.port = port;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼>

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值