Java netty实现UDP 104数据接收

添加依赖

复制代码
    <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.35.Final</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
复制代码

 

 

创建服务端

复制代码
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;

public class IEC104Service {
/**
     *创建服务器端  监听PropertiesUtils.PORT
     * 这个UDP通信协议
     */
    public  void createConnetion() throws InterruptedException {
        NioEventLoopGroup main = new NioEventLoopGroup(1);
        NioEventLoopGroup group = new NioEventLoopGroup();

        Bootstrap bootstrap = new Bootstrap();

        try {
        //设置channel为
NioDatagramChannel
        bootstrap.group(group)
        .channel(NioDatagramChannel.
class)
        .option(ChannelOption.SO_BROADCAST, true)
        .handler(
new ChannelInitializer<NioDatagramChannel>() {
          @Override
          
protected void initChannel(NioDatagramChannel ch) throws Exception {
            ChannelPipeline pipeline
= ch.pipeline();
            pipeline.addLast(
new IEC104ServerHandler(factory));
          }
        });
        ChannelFuture future
= bootstrap.bind(60000).sync();
        future.channel().closeFuture().sync();
    }
finally {
      main.shutdownGracefully();
      group.shutdownGracefully();
    }
  }
}
复制代码

创建处理器handler

复制代码
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author HR
 */
@Slf4j
public class IEC104ServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
   private static ExecutorService executorService = Executors.newFixedThreadPool(10);
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext,DatagramPacket data) throws Exception {
        ByteBuf byteBuf = data.content();
        int len = byteBuf.readableBytes();
        byte[] bytes=new byte[len];
         byteBuf.readBytes(bytes);
        String strData = HexConvert.BinaryToHexString(bytes);
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                log.info(strData);
          //TODO根据需求实现自己的业务逻辑 } }); } }
复制代码

 

104数据工具类

复制代码
package com.jetch.collet.utils;

public class HexConvert {
    public static String BinaryToHexString(byte[] bytes) {

        String hexStr = "0123456789ABCDEF";

        String result = "";

        String hex = "";

        for (byte b : bytes) {

                hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));

            hex += String.valueOf(hexStr.charAt(b & 0x0F));

            result += hex + " ";

        }

        return result.trim();

    }
    public static short bytes2Short2(byte[] b) {

        short i = (short) (((b[1] & 0xff) << 8) | b[0] & 0xff);

        return i;

    }
}
复制代码

 

自己整理了代码在gitee仓库  有需要的可以下载



posted @   转身瞬间  阅读(1453)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示