netty入门实例
TimeServer.java
- package netty.timeserver.server;
- 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 {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- // 配置服务器的NIO线程租
- ServerBootstrap b = new ServerBootstrap();
- 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 {
- System.out.println("server initChannel..");
- arg0.pipeline().addLast(new TimeServerHandler());
- }
- }
- public static void main(String[] args) throws Exception {
- int port = 9000;
- if (args != null && args.length > 0) {
- try {
- port = Integer.valueOf(args[0]);
- } catch (NumberFormatException e) {
- }
- }
- new TimeServer().bind(port);
- }
- }
TimeServerHandler.java
- package netty.timeserver.server;
- import java.util.Date;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- public class TimeServerHandler extends ChannelInboundHandlerAdapter {
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg)
- throws Exception {
- System.out.println("server channelRead..");
- 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 order:" + body);
- String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(
- System.currentTimeMillis()).toString() : "BAD ORDER";
- ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());
- ctx.write(resp);
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- System.out.println("server channelReadComplete..");
- ctx.flush();//刷新后才将数据发出到SocketChannel
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
- throws Exception {
- System.out.println("server exceptionCaught..");
- ctx.close();
- }
- }
TimeClient.java
- package netty.timeserver.client;
- 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();
- b.group(group).channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .handler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel arg0)
- throws Exception {
- System.out.println("client initChannel..");
- arg0.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 = 9000;
- if (args != null && args.length > 0) {
- try {
- port = Integer.parseInt(args[0]);
- } catch (Exception e) {
- }
- }
- new TimeClient().connect(port, "127.0.0.1");
- }
- }
TimeClientHandler.java
- package netty.timeserver.client;
- import java.util.logging.Logger;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- public class TimeClientHandler extends ChannelInboundHandlerAdapter {
- private static final Logger logger = Logger
- .getLogger(TimeClientHandler.class.getName());
- private final ByteBuf firstMessage;
- public TimeClientHandler() {
- byte[] req = "QUERY TIME ORDER".getBytes();
- firstMessage = Unpooled.buffer(req.length);
- firstMessage.writeBytes(req);
- }
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- //与服务端建立连接后
- System.out.println("client channelActive..");
- ctx.writeAndFlush(firstMessage);
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg)
- throws Exception {
- System.out.println("client channelRead..");
- //服务端返回消息后
- ByteBuf buf = (ByteBuf) msg;
- byte[] req = new byte[buf.readableBytes()];
- buf.readBytes(req);
- String body = new String(req, "UTF-8");
- System.out.println("Now is :" + body);
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
- throws Exception {
- System.out.println("client exceptionCaught..");
- // 释放资源
- logger.warning("Unexpected exception from downstream:"
- + cause.getMessage());
- ctx.close();
- }
- }
netty入门实例的更多相关文章
- Netty入门实例及分析
什么是netty?以下是官方文档的简单介绍: The Netty project is an effort to provide an asynchronous event-driven netwo ...
- netty入门(一)
1. netty入门(一) 1.1. 传统socket编程 在任何时候都可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,这可能算是一种资源浪费. 需要为每个线程的调用栈都分配内存,其默认值 ...
- Netty入门(一)之webSocket聊天室
一:简介 Netty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能.高可靠性协议的服务器和客户端. 换句话说,Netty 是 ...
- Netty入门二:开发第一个Netty应用程序
Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43 CSDN博客 原文 http://blog.csdn.net/suifeng3051/article/ ...
- Java网络编程 -- Netty入门
Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...
- Netty入门与实战教程总结分享
前言:都说Netty是Java程序员必须要掌握的一项技能,带着不止要知其然还要知其所以然的目的,在慕课上找了一个学习Netty源码的教程,看了几章后着实有点懵逼.虽然用过Netty,并且在自己的个人网 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- Netty入门(三):EventLoop
前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...
- Netty入门(二):Channel
前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel 在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它 ...
随机推荐
- CUDA学习笔记(二)【转】
来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...
- ViewPager动态加载、删除页面
很多人在网上说ViewPager的PagerAdapter.notifyDataSetChanged()无效.刚开始我也这样认为,甚至被误导以为是真理. 后来,找了一下,在PagerAdatpar ...
- python datetime
不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...
- OCR文字设别软件没有权限管理服务器上的许可证怎么办
在使用ABBYY产品,无论是ABBYY FineReader 12,还是ABBYY PDF Transformer+的时候,当你启动许可管理器时,可能会出现"您没有权限管理许可服务器(服务器 ...
- 清除PDF里的元数据和机密信息的方法
相信很多人都知道,PDF文档的表现形式可以大不相同,它们可能包含某些数据,乍一看根本看不见,那些数据可能是不适合共享的信息-比如元数据(作者.主题.关键词).书签.扫描文档里的文本层等,通过ABBYY ...
- 使用架构(XSD)验证XML文件
假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...
- MySQL之选择字段数据类型
MySQL支持的数据类型很多,选择正确的数据类型对于 获得高性能至关重要.在选择时有个简单的原则有助于做出更好的选择. 简单的原则: A.通常最小的是最好的 因为这样可以用更少的磁盘.内容.CPU缓存 ...
- eclipse svn subclipse下载地址
http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 Eclipse 3.x Subclipse release ...
- ChinaUnix上的帮助手册还不错!
无意中发现ChinaUnix上的Linux帮助手册还真不错啊,有时间多看一看: http://man.chinaunix.net/linux/debian/debian_learning/index. ...
- nova分析(2)—— nova-all
nova-all是一个用来启动所有nova服务的辅助脚本,注意只是启动所有服务,不包括停止和重启等功能. nova-all的入口在 nova.cmd.all:main ,脚本也比较简单,这儿就贴下代码 ...