目录总览:
服务端代码
NettyServer:
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) throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true) //广播
.option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置UDP读缓冲区为2M
.option(ChannelOption.SO_SNDBUF, 1024 * 1024)// 设置UDP写缓冲区为1M
.handler(new MyChannelInitializer());
ChannelFuture f = b.bind(7398).sync();
System.out.println("服务端已启动......");
f.channel().closeFuture().sync();
} finally {
//优雅的关闭释放内存
group.shutdownGracefully();
}
}
}
MyServerHandler:
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;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class MyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
String msg = packet.content().toString(Charset.forName("UTF-8"));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " UDP服务端接收到消息:" + msg);
//向客户端发送消息
Scanner str = new Scanner(System.in);
new Thread(() -> {
while(true){
System.out.println("你想对客户端说:");
String line = str.nextLine();
// 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
byte[] bytes = line.getBytes(Charset.forName("UTF-8"));
DatagramPacket data = new DatagramPacket(Unpooled.copiedBuffer(bytes), packet.sender());
ctx.writeAndFlush(data);//向客户端发送消息
}
}).start();
}
MyChannelInitializer:
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;
public class MyChannelInitializer extends ChannelInitializer<NioDatagramChannel> {
private EventLoopGroup group = new NioEventLoopGroup();
@Override
protected void initChannel(NioDatagramChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
// 解码转String,注意调整自己的编码格式GBK、UTF-8
//pipeline.addLast("stringDecoder", new StringDecoder(Charset.forName("GBK")));
pipeline.addLast(group, new MyServerHandler());
}
}
客户端代码
NettyClient:
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;
import java.util.Scanner;
public class NettyClient {
public static void main(String[] args) {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group).channel(NioDatagramChannel.class)
.handler(new MyChannelInitializer());
Channel ch = b.bind(7399).sync().channel();
System.out.println("客户端已经连接服务器:"+ch.isOpen());
Scanner str = new Scanner(System.in);
while(true){
System.out.println("你想对服务端说:");
String line = str.nextLine();
//向目标端口发送信息
ch.writeAndFlush(new DatagramPacket(
Unpooled.copiedBuffer(line, Charset.forName("UTF-8")),
new InetSocketAddress("127.0.0.1", 7398))).sync();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
}
MyClientHandler:
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {
//接受服务端发送的内容
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
String msg = packet.content().toString(Charset.forName("UTF-8"));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " UDP客户端接收到消息:" + msg);
}
MyChannelInitializer:
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.nio.NioDatagramChannel;
public class MyChannelInitializer extends ChannelInitializer<NioDatagramChannel> {
@Override
protected void initChannel(NioDatagramChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
// 解码转String,注意调整自己的编码格式GBK、UTF-8
//pipeline.addLast("stringDecoder", new StringDecoder(Charset.forName("GBK")));
pipeline.addLast(new MyClientHandler());
}
启动流程 :先启动NettyServer类main方法,然后在启动 NettyClient类main方法
调用效果图:
相互通信完成
扫描二维码关注公众号,回复:
16481171 查看本文章