使用netty开发一个实现以下功能的程序:客户端向服务端发送消息,服务端返回消息。
首先是服务端的代码:
复制代码
服务端IO事件处理类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41public class NettyServer { public static void main(String[] args) { new NettyServer().bind(8989); } public void bind(int port){ /** * 配置服务端的NIO线程组,NioEventLoopGroup是个线程组 * 这里创建两个的原因是:一个用于服务端接收客户端的连接 * 另一个用于进行SocketChannel的网络读写 */ NioEventLoopGroup bossGroup = new NioEventLoopGroup(); NioEventLoopGroup workGroup = new NioEventLoopGroup(); System.out.println("Server is starting on port : "+port+"..."); try{ //创建ServerBootstrap对象,它是Netty用于启动NIO服务端的辅助启动类,目的是降低服务端的开发复杂度 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup,workGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG,1024)//配置NioServerSocketChannel的TCP参数 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception {//绑定IO事件的处理类 socketChannel.pipeline().addLast(new TimeServerHandler()); } }); //绑定端口,同步等待成功,ChannelFuture主要用于异步操作的通知回调 ChannelFuture f = b.bind(port).sync();//sync():同步阻塞方法 //等待服务端监听端口关闭 f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); }finally { //优雅退出,释放线程池资源 bossGroup.shutdownGracefully(); workGroup.shutdownGracefully(); } } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29public class TimeServerHandler extends ChannelHandlerAdapter{ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; //相当于缓冲区 byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req,"UTF-8"); System.out.println("The time server receive message is : "+body); String resp = ""; if (body!=null){ resp = "Server has received message that is : "+body; }else { resp = "Server has not received message..."; } ByteBuf response = Unpooled.copiedBuffer(resp.getBytes()); ctx.write(response); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); //将消息发送队列中的消息全部写入到SocketChannel中发送给对方 } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close();//发生异常时,关闭ChannelHandlerContext } }
客户端代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34public class NettyClient { public static void main(String[] args) { int port = 8989; new NettyClient().connect(port,"127.0.0.1"); } public void connect(int port,String host){ //配置客户端NIO线程组 NioEventLoopGroup group = new NioEventLoopGroup(); try{ Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY,true) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new TimeClientHandler()); } }); //发起异步连接操作 ChannelFuture f = b.connect(host, port).sync(); //等待客户端链路关闭 f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); }finally { //优雅退出,释放NIO线程组 group.shutdownGracefully(); } } }
客户端IO处理类:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public class TimeClientHandler extends ChannelHandlerAdapter{ private static final Logger logger = Logger .getLogger(TimeClientHandler.class.getName()); private final ByteBuf buf; public TimeClientHandler() { byte[] req = "client is sending message...".getBytes(); buf = Unpooled.buffer(req.length); buf.writeBytes(req); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(buf); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req,"utf-8"); System.out.println("接收到服务端的反馈为:"+body); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { //释放资源 logger.warning("Unexpected exception from downStream : "+cause.getMessage()); ctx.close(); } }
最后
以上就是威武未来最近收集整理的关于Netty入门应用开发的全部内容,更多相关Netty入门应用开发内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复