- 浏览: 218922 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (114)
- hbase (3)
- akka (7)
- hdfs (6)
- mapreduce (1)
- hive (0)
- zookeeper (8)
- storm (0)
- geese (0)
- leaf (0)
- stormbase (0)
- scala (2)
- oozie (11)
- zeromq (1)
- netty (3)
- mongodb (0)
- sqoop (2)
- flume (3)
- mahout (1)
- redis (0)
- lucene (1)
- solr (1)
- ganglia (3)
- 分布式理论 (2)
- hadoop (42)
- others (14)
- mq (1)
- clojure (3)
- flume ng (1)
- linux (1)
- esper (0)
最新评论
-
javalogo:
[b][i][u]引用[list]
[*][*][flash= ...
什么是Flume -
leibnitz:
what are they meanings
Hadoop Ganglia Metric Item -
di1984HIT:
没用过啊。
akka 介绍-Actor 基础 -
di1984HIT:
写的不错。
Hadoop管理-集群维护 -
developerinit:
很好,基本上介绍了
什么是Flume
//TIME 服务器端协议实现
package com.bigdata.jboss.basic; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelFutureListener; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class TimeServerHandler extends SimpleChannelHandler{ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { Channel channel = e.getChannel(); ChannelBuffer buffer = ChannelBuffers.buffer(4); buffer.writeInt((int) (System.currentTimeMillis()/1000)); ChannelFuture future = channel.write(buffer); future.addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) throws Exception { future.getChannel().close(); } }); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { e.getCause().printStackTrace(); e.getChannel().close(); } }
1.channelConnected 方法,当连接已经建立后,会调用。会返回给客户端以秒显示的整数
2.ChannelBuffers是一个帮助类(非常有用),buffer方法会近回4字节的ChannelBuffer实例。
3.Channel的write方法会返回ChannelFuture实例,ChannelFuture实例会等待客户端接收到数据后,然后关闭连接。
4.获得客户端读取完数据的通知,是通过给ChannelFuture添加ChannelFutureListener实例,来获得客户端读取完成的时 机。也可以简化注册监听f.addListener(ChannelFutureListener.CLOSE);
package com.bigdata.jboss.basic; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; public class TimeServer { public static void main(String[] args) { ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()); ServerBootstrap bootstrap = new ServerBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new TimeServerHandler()); } }); bootstrap.setOption("child.tcpNoDelay", true); bootstrap.setOption("child.keepAlive", true); bootstrap.bind(new InetSocketAddress(8080)); System.out.println("Time Server started"); } }
package com.bigdata.jboss.basic; import java.util.Date; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class TimeClientHandler extends SimpleChannelHandler { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ChannelBuffer buffer = (ChannelBuffer) e.getMessage(); long date = buffer.readInt()*1000L; e.getChannel().close(); System.out.println(new Date(date)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { e.getCause().printStackTrace(); e.getChannel().close(); } }
//TIME 客户端
package com.bigdata.jboss.basic; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; public class TimeClient { public static void main(String[] args) { String host = args[0]; int port = Integer.parseInt(args[1]); ChannelFactory factory = new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ClientBootstrap bootstrap = new ClientBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new TimeClientHandler()); } }); bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive", true); ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)); future.awaitUninterruptibly(); if(false == future.isSuccess()){ future.getCause().printStackTrace(); } future.getChannel().getCloseFuture().awaitUninterruptibly(); factory.releaseExternalResources(); } }
1.NioClientSocketChannelFactory是客户端的ChannelFactory类。
2.ClientBootStrapo是客户端的BootStrap。
3.客户端TCP/IP参数无"child."前缀。
4.使用connect连接服务器。
5.ClientBootstrap返回一个ChannelFuture,指明当连接成功或失败。
6.等待连接尝试是否成功或失败。
7.如果失败,会输出异常信息。
8.等待closeFuture,连接使用完成。
9.ChannelFactory释放所有资源,如线程池等。
//客户端增强
原因:以流传输的TCP/IP,OS的Receive Buffer Queue不是以包来缓存,而是缓存bytes,当Traffic比较大的时候,会造成取的Frames不完整,需要判断接收到的数据是否完整。
//TIME Decoder
package com.bigdata.jboss.basic; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.FrameDecoder; public class TimeDecoder extends FrameDecoder{ @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { Object result = null; if(buffer.readableBytes() < 4){ result = null; }else{ result = buffer.readBytes(4); } return result; } }
package com.bigdata.jboss.basic; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; public class TimeClientImprovment { public static void main(String[] args) { String host = args[0]; int port = Integer.parseInt(args[1]); ChannelFactory factory = new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ClientBootstrap bootstrap = new ClientBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception {// improment return Channels.pipeline(new TimeDecoder(), new TimeClientHandler()); } }); bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive", true); ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)); future.awaitUninterruptibly(); if(false == future.isSuccess()){ future.getCause().printStackTrace(); } future.getChannel().getCloseFuture().awaitUninterruptibly(); factory.releaseExternalResources(); } }
//传递POJO信息
package com.bigdata.jboss.basic; import java.util.Date; public class UnixTime { private final int value; public UnixTime(int value) { super(); this.value = value; } public int getValue() { return value; } @Override public String toString() { return new Date(value*1000L).toString(); } }
package com.bigdata.jboss.basic; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelFutureListener; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class TimeServerHandler extends SimpleChannelHandler{ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { Channel channel = e.getChannel(); ChannelBuffer buffer = ChannelBuffers.buffer(4); buffer.writeInt((int) (System.currentTimeMillis()/1000)); ChannelFuture future = channel.write(buffer); future.addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) throws Exception { future.getChannel().close(); } }); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { e.getCause().printStackTrace(); e.getChannel().close(); } }
package com.bigdata.jboss.basic; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class UnixTimeEncoder extends SimpleChannelHandler{ @Override public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ChannelBuffer buffer = ChannelBuffers.buffer(4); UnixTime unixTime = (UnixTime) e.getMessage(); buffer.writeInt(unixTime.getValue()); Channels.write(ctx, e.getFuture(),buffer); } }
package com.bigdata.jboss.basic; import java.net.InetSocketAddress; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; public class UnixTimeServer { /** * @param args */ public static void main(String[] args) { ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()); ServerBootstrap bootstrap = new ServerBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new UnixTimeServerHandler(),new UnixTimeEncoder()); } }); bootstrap.setOption("child.tcpNoDelay",true); bootstrap.setOption("child.keepAlive",true); bootstrap.bind(new InetSocketAddress(8080)); System.out.println("UnixTime Server started"); } }
package com.bigdata.jboss.basic; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class UnixTimeClientHandler extends SimpleChannelHandler{ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { UnixTime unixTime = (UnixTime) e.getMessage(); e.getChannel().close(); System.out.println(unixTime); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { e.getCause().printStackTrace(); e.getChannel().close(); } }
package com.bigdata.jboss.basic; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.FrameDecoder; public class UnixTimeClientDecoder extends FrameDecoder{ @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { UnixTime result = null; if(buffer.readableBytes() >= 4){ result = new UnixTime(buffer.readInt()); } return result; } }
package com.bigdata.jboss.basic; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; public class UnixTimeClient { public static void main(String[] args) { String host = args[0]; int port = Integer.parseInt(args[1]); ChannelFactory factory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ClientBootstrap bootstrap = new ClientBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new UnixTimeClientDecoder(),new UnixTimeClientHandler()); } }); bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive",true); ChannelFuture future =bootstrap.connect(new InetSocketAddress(host, port)); future.awaitUninterruptibly(); if(false == future.isSuccess()){ future.getCause().printStackTrace(); } future.getChannel().getCloseFuture().awaitUninterruptibly(); factory.releaseExternalResources(); } }
相关推荐
Netty5完整例子,里面包含编码,解码,心跳处理等,代码可用。 例子的内容是:服务端启动,客户端启动,客户端连接服务器后服务器发一个Message的对象给客户端,客户端接受并打印Message里边的内容。编解码的处理为:...
基于netty各种例子。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
在本“Netty 聊天例子”中,我们将深入探讨如何利用 Netty 构建一个简单的聊天应用,这对于初学者来说是一个很好的起点。 **Netty 基础** Netty 的核心组件包括 Channel、Bootstrap、Pipeline 和 EventLoopGroup。...
这个压缩包“netty各种例子(基于netty各种例子。).zip”显然是一个包含Netty示例代码的资源包,可以帮助开发者更好地理解和使用Netty框架。 在Java世界中,Netty因其高效、易用和丰富的特性而被广泛应用于多种场景...
在"Netty实现WebSocket例子"中,我们将探讨如何使用Netty来搭建WebSocket服务器,并实现客户端与服务器之间的双向通信。首先,我们需要理解WebSocket的基本概念和工作原理。WebSocket协议是基于TCP的,它通过HTTP的...
通过 Netty 的官网例子,你可以深入学习这些概念并了解如何在实际项目中运用。官方示例通常覆盖了基础到高级的各种用法,是理解和掌握 Netty4.0 的良好起点。你可以从 netty-4.0 压缩包中的源代码开始,逐步分析和...
Netty 提供了多种方式来处理超时,包括使用 `ChannelOption.SO_TIMEOUT` 设置套接字超时,或者通过 `WriteTimeoutHandler` 和 `ReadTimeoutHandler` 来自定义读写超时。`WriteTimeoutHandler` 监控写操作并触发超时...
这个压缩包文件"java Netty 框架例子源码.rar"很可能包含了一系列示例代码,帮助我们了解和学习如何在实际项目中使用 Netty。 Netty 的核心组件包括: 1. **Channel**:是 Netty 中的基本概念,代表一个打开的连接...
这个“Netty 官方例子”压缩包包含了一系列官方提供的示例代码,旨在帮助开发者更好地理解和运用 Netty 框架。通过在 IntelliJ IDEA(简称 IDEA)中运行这些例子,我们可以深入学习 Netty 的核心特性和使用方式。 1...
这个“netty官方例子”压缩包提供了一系列的示例代码,帮助开发者更好地理解和运用Netty框架。这些例子是基于Netty 4版本,已经整理为可直接运行的Maven工程,便于开发者在本地进行实践和学习。 首先,我们要了解...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它是Java领域非常流行的网络库,尤其在处理高并发、低延迟的网络应用中表现出色。本篇文章将深入探讨Netty的...
这个“netty入门例子”旨在帮助初学者理解Netty的基本用法和特性,而不是简单地翻译官方文档,它提供了几个开发模板,以便于深入理解Netty中的消息异步通信机制和TCP通信的封装。 首先,Netty的核心是它的异步模型...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含的是Netty 4.0.0.CR3版本的相关资源,包括源码、示例以及API文档,对于学习和理解Netty的工作...
这个“netty小例子”很可能是为了帮助初学者理解和掌握 Netty 的基本用法,包括如何创建客户端和服务端,以及如何集成日志系统。 在 Netty 中,服务端通常由 `ServerBootstrap` 类来初始化,它负责配置服务器的参数...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty的工作原理,以及它在淘宝这一大型电商平台中的具体应用。 首先,让我们了解...
在“Netty3.5代码例子”中,你可能会看到以下几个关键组件: - **Bootstrap**:这是启动服务器或客户端的入口点,配置网络连接的各种参数。 - **ServerBootstrap**:用于创建服务器端的Bootstrap。 - **...
在“netty proxy 代理例子”中,我们将会探讨如何利用 Netty 实现一个代理服务器,该代理服务器可以转发客户端的请求到目标服务器,并将响应回传给客户端。 首先,我们需要理解代理服务器的基本原理。代理服务器...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“demo.rar”压缩包包含了基于 Netty 实现的代码示例,可以帮助我们更好地理解并学习 Netty 的核心概念和...
这个“Netty5例子”很可能是包含了一系列使用Netty 5版本编写的示例代码,用于帮助开发者理解和掌握Netty的核心概念和功能。 在Netty中,关键的概念包括: 1. **BossGroup 和 WorkerGroup**:Netty 使用 NIO(非...
在实际应用中,`java-netty-master` 可能包含了简单的服务器和客户端示例,如 Echo Server(服务器接收并回显客户端发送的数据)和 Time Client(客户端向服务器请求当前时间)。通过这些例子,你可以学习如何配置 ...