你是否在寻找一个代理来调试你的客户端-服务端的通讯?不需要再寻觅!Netty已经通过示例来展现这个功能了!
Netty是一个NIO C/S框架,能够快速、简单的开发协议服务器和客户端等网络应用。它能够很大程度上简单化、流水线化开发网络应用,例如TCP/UDP socket服务器。你可以在这里找到Netty的指导教程。
在Netty中,实现的代码或者业务逻辑的切入点需要依赖于处理器。处理器基于拦截器模式,类似传统servlet-web应用的过滤器。处理器提供一个事件模型可以让应用监控数据的读取/发送、修改数据、转换数据、根据数据做出响应、等等。总而言之,处理器允许你将关注点完全抽象到不同的类中。
处理器依据指定的顺序添加到pipeline中。这个顺序决定处理器如何、何时被调用。如果一个处理器依赖其他的处理器(例如一个压缩处理器),那么你需要确定pipeline中的这个处理器在其他处理器前面(译注:upstream类型事件中需要此顺序)。通常数据是异步读取到系统中,这些数据会被包装为一个ChannelBuffer对象。这个对象根据downstream规则从第一个handler向下传送给其他后面的处理器中(触发有一个处理器选择停止这个流程或者抛出异常)。
下面是Netty文档中的组件结构图:
下面的示例代码介绍了如何使用HexDumpProxy类代理客户端和服务器端之间的请求,示例代码如下:
package org.jboss.netty.example.proxy;
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.socket.ClientSocketChannelFactory;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
public class HexDumpProxy {
public static void main(String[] args) throws Exception {
// 校验命令行参数。
if (args.length != 3) {
System.err.println(
"Usage: " + HexDumpProxy.class.getSimpleName() +
" ");
return;
}
// 解析命令行参数。
int localPort = Integer.parseInt(args[0]);
String remoteHost = args[1];
int remotePort = Integer.parseInt(args[2]);
System.err.println(
"Proxying *:" + localPort + " to " +
remoteHost + ':' + remotePort + " ...");