Netty的使用(二)
程序员文章站
2022-04-22 18:05:31
...
Netty的基本使用(udp发送局域网广播)
1.udp服务端搭建
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap boot = new Bootstrap();
boot.group(group)
.option(ChannelOption.SO_BROADCAST, true)
.channel(NioDatagramChannel.class)
.handler(new UdpServerHandler());
boot.bind(57572).sync().channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
2.实现UdpServerHandler 方法
class UdpServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println(ctx.channel().remoteAddress());
ctx.executor().parent().execute(new Runnable() {
@Override
public void run() {
for (; ; ) {
ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("{" +
"\"className\": \"MsgHDServerInfo\"," +
" \"dataLength\": 0," +
" \"msgJson\": \"{\"port\": 57571,\"teacherName\": \"19900000985\",\"teacherId\": \"4795\",\"className\": \"公共班级222\",\"classId\": \"FFFFFFFF-FFFF-FFFF-EEFF-FFFFFFFFFFFF\",\"version\": \"1.0.0-alpha\",\"versionCode\": 20170801,\"webUrl\": \"http://117.78.8.206:8084\"}\"" +
"}", Charset.forName("UTF-8")), new InetSocketAddress("255.255.255.255", 57572)));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println(ctx.channel().remoteAddress());
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
DatagramPacket packet = (DatagramPacket) msg;
ByteBuf byteBuf = packet.copy().content();
byte[] bytes = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(bytes);
String content = new String(bytes);
System.out.println("发送广播:" + packet.sender() + "," + content);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
3.实现udp客户端
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap boot = new Bootstrap();
boot.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
//端口重用
.option(ChannelOption.SO_REUSEADDR, true)
.handler(new UdpClientHandler());
//0为随机端口
boot.bind(57572).sync().channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
4.实现UdpClientHandler 方法
class UdpClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
DatagramPacket packet = (DatagramPacket) msg;
ByteBuf byteBuf = packet.copy().content();
byte[] bytes = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(bytes);
String content = new String(bytes);
System.out.println("接收到广播:" + packet.sender().toString() + "," + content);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}