UDP通信案例
在Netty通信中UDP的实现方式也非常简单,只要注意部分代码区别于TCP即可。注意的知识点 ;NioDatagramChannel、ChannelOption.SO_BROADCAST
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 [1] 描述了 UDP。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
1,服务端
package com.forezp.util.netty.test08udp.server; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioDatagramChannel; public class NettyServer { public static void main(String[] args) { EventLoopGroup group=new NioEventLoopGroup(); Bootstrap bootstrap=new Bootstrap(); try { bootstrap .group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST,true) .option(ChannelOption.SO_RCVBUF,2048*1024) .option(ChannelOption.SO_SNDBUF,1024*1024) .handler(new MyUdpChannelInitializer()); ChannelFuture future=bootstrap.bind(6000).sync(); System.out.println("netty server start..."); future.channel().closeFuture().sync(); }catch (Exception e){ e.printStackTrace(); }finally { group.shutdownGracefully(); } } }
package com.forezp.util.netty.test08udp.server; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioDatagramChannel; public class MyUdpChannelInitializer extends ChannelInitializer<NioDatagramChannel> { private EventLoopGroup group=new NioEventLoopGroup(); @Override protected void initChannel(NioDatagramChannel ch) throws Exception { ch.pipeline().addLast(group,new MyUdpHandler()); } }
package com.forezp.util.netty.test08udp.server; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import java.nio.charset.Charset; /*** * 消息处理 */ public class MyUdpHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { //接收消息 String msgstr=msg.content().toString(Charset.forName("GBK")); System.out.println("服务端接收到的消息:"+msgstr+"\r\n"); //向客户端发送消息 String sendmsg="通知:服务端已收到消息"; byte[] bytes=sendmsg.getBytes(Charset.forName("GBK")); // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据 DatagramPacket data=new DatagramPacket(Unpooled.copiedBuffer(bytes),msg.sender()); ctx.writeAndFlush(data); } }
2,客户端
package com.forezp.util.netty.test08udp.client; import com.forezp.util.netty.test08udp.server.MyUdpChannelInitializer; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import java.net.InetSocketAddress; import java.nio.charset.Charset; public class UdpClient { public static void main(String[] args) { EventLoopGroup group=new NioEventLoopGroup(); try { Bootstrap bootstrap=new Bootstrap(); bootstrap .group(group) .channel(NioDatagramChannel.class) .handler(new MyUdpClientChannelInitializer()); Channel ch=bootstrap.bind(6000).sync().channel(); ch.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("hello,world. service", Charset.forName("GBK")), new InetSocketAddress("127.0.0.1",6000))).sync(); ch.closeFuture().await(); }catch (Exception e){ e.printStackTrace(); }finally { group.shutdownGracefully(); } } }
package com.forezp.util.netty.test08udp.client; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.nio.NioDatagramChannel; public class MyUdpClientChannelInitializer extends ChannelInitializer<NioDatagramChannel> { @Override protected void initChannel(NioDatagramChannel ch) throws Exception { ch.pipeline().addLast(new MyUdpClientHandler()); } }
package com.forezp.util.netty.test08udp.client; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import java.nio.charset.Charset; public class MyUdpClientHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { String msg=packet.content().toString(Charset.forName("GBK")); System.out.println("客户端接收到消息:"+msg+"\r\n"); } }
3,测试:

好记性不如烂笔头
浙公网安备 33010602011771号