第一个Netty程序
来源:互联网 发布:matlab算矩阵乘法 编辑:程序博客网 时间:2024/05/16 05:00
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">去官网下载Netty包,导入jar文件即可</span>
客服端代码
import io.netty.bootstrap.Bootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;public class TimeClient { public void connect(int port, String host) throws Exception { // 创建客户端NIO线程组 EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap();//启动NIO服务的辅助启动类,为了降低服务端的开发复杂度 b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer<SocketChannel>() { //创建NioSocketChannel成功之后,初始化的时候将它的SocketChannel设置到ChannelPipeline中用于处理网络IO事件。 @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new TimeClientHandler()); } }); // 发起异步连接操作 ChannelFuture f = b.connect(host, port).sync(); // 阻塞等待客户端链路关闭 f.channel().closeFuture().sync(); } finally { // 释放NIO线程组 group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; new TimeClient().connect(port, "127.0.0.1"); }}
</pre><pre name="code" class="java">
import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;import java.util.logging.Logger;public class TimeClientHandler extends ChannelHandlerAdapter { private static final Logger logger = Logger.getLogger(TimeClientHandler.class.getName()); private final ByteBuf firstMessage; //初始化要发送的数据 public TimeClientHandler() { byte[] req = "当前时间是:".getBytes(); firstMessage = Unpooled.buffer(req.length); firstMessage.writeBytes(req); } @Override public void channelActive(ChannelHandlerContext ctx) { ctx.writeAndFlush(firstMessage); //发送信息给服务器 } @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) { System.out.print("异常?"); // 释放资源 logger.warning("Unexpected exception from downstream : " + cause.getMessage()); ctx.close(); }}服务端代码
import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;public class TimeServer { public void bind(int port) throws Exception { // 配置服务端的NIO线程组 EventLoopGroup bossGroup = new NioEventLoopGroup();//接受客服的链接 EventLoopGroup workerGroup = new NioEventLoopGroup();//进行SocketChannel的读写操作 try { ServerBootstrap b = new ServerBootstrap();//启动NIO服务的辅助启动类,为了降低服务端的开发复杂度 /* 将两个NIO加入到ServerBootstrap中,接着创建Channel为NIOServerSocketChannel,相当于ServerSocketChannel类。 配置NIOServerSocketChannel的TCP参数将块大小设置成1024.最后绑定IO事件的处理类ChildChannelHander,主要处理网络IO事件对信息进行编解码等。*/ b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024).childHandler(new ChildChannelHandler()); // 绑定端口,同步等待成功 ChannelFuture f = b.bind(port).sync(); //阻塞等待, 等待服务端监听端口关闭 f.channel().closeFuture().sync(); } finally { //释放线程池资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel arg0) throws Exception { //创建NioSocketChannel成功之后,初始化的时候将它的SocketChannel设置到ChannelPipeline中用于处理网络IO事件。 arg0.pipeline().addLast(new TimeServerHandler()); } } public static void main(String[] args) throws Exception { int port = 8080; new TimeServer().bind(port); }}
import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;import java.text.SimpleDateFormat;import java.util.Date;public class TimeServerHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //读取信息 ByteBuf buf = (ByteBuf) msg; byte[] req = new byte[buf.readableBytes()];//获取缓冲区可读的字节数,根据字节数创建byte数组, buf.readBytes(req);//将缓冲区的字节数组复制到新建的字节数组中, String body = new String(req, "UTF-8"); System.out.println("客服端发来的信息:" + body); //发送信息 Date time = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = simpleDateFormat.format(time); String str = body + s; ByteBuf resp = Unpooled.copiedBuffer(str.getBytes()); ctx.write(resp);//异步将信息发送给客服端 } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush();//将消息发送列队中的消息写入到SocketChannel中发送给对方 } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { System.out.print("异常"); ctx.close();//关闭资源 }}
0 0
- 第一个Netty程序
- 第一个Netty程序
- 【Netty第二章】 第一个Netty程序
- 02 第一个Netty程序
- Netty In Action中文版 - 第二章:第一个Netty程序
- Netty In Action中文版 - 第二章:第一个Netty程序
- netty in action第二章-第一个netty程序
- Netty系列四:第一个Netty程序(业务线程异步)
- 第一个netty应用程序
- java网络编程之Netty第一个程序(四)
- Netty【二】 第一个Netty应用
- Netty In Action 读书笔记 - 第二章 第一个Netty应用
- Netty入门应用之第一个netty项目
- Netty in action—第一个Netty应用
- 你的第一个Netty应用
- netty4 详解---开发第一个Netty应用程序
- AAANetty入门:开发第一个Netty应用程序
- 第一个C++程序
- spring
- Leetcode31 Next Permutation
- 阿里云配置sshd保持ssh连接
- 老王的宝贝们
- 前端自动化测试
- 第一个Netty程序
- windows和android调用第三方C++库(静态库lib、动态库dll)
- HDU-5778 abs
- window 下搭建maven nexus私服
- 在 Mac OS X 终端里使用 Solarized 配色方案
- 牛客网上,华为迷宫问题
- Masonry使用心得
- 从零开始学Android(三)
- 排序算法