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仓库 有需要的可以下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通