Proxy server example
iwayindia
iwayindia at gmail.com
Thu Aug 20 06:26:00 EDT 2009
Hi,
Thanks for you reply...
I did not get any improvement after this... but found a few interesting
facts while working on this
1) The program what I've written was handling only the first request, but
not sub sequent request. I can see MessageReceived method is being called,
but not getting response back.
2) CPU Utilization during the program execution was 100%. Was shocked
looking at this, I could not figure out what causing this. My system config
is Intel(R) Core(TM)2 CPU, t5200 @ 1.60GHz, with 2GM of RAM.
You asked me for DIFF patch, I can not do that as I do not have the code in
CVS.
Here are a few comments
1) Added HTTP encoder and decoder to get the REMOTE HOST and REMOTE PORT
2) Was trying to define a Global class with required constants
Please let me help out on this,
Sorry to trouble you,
Thanks a lot in advance, Naveen
iwayindia wrote:
>
> Hi Guys,
>
> I'm trying a proxy server where I could able to hit any remote server
> running on any port.
>
> I just did a few changes to the Hex*** proxy example published in NETTY.
>
> for some reason, I'm not getting any response in the following code...
> Please correct me...
>
> //Removed imports
> public class Proxy {
>
> public static void main(String[] args) throws Exception {
> System.err.println("Proxying *:8080 ...");
>
> ServerBootstrap sb = new ServerBootstrap(
> new
> NioServerSocketChannelFactory(Globals.getExecutor(),
> Globals.getExecutor()));
>
> ChannelPipeline pipeline = sb.getPipeline();
>
> pipeline.addLast("decoder", new HttpRequestDecoder());
> pipeline.addLast("encoder", new HttpResponseEncoder());
> pipeline.addLast("handler", new ProxyInboundHandler());
>
> sb.bind(new InetSocketAddress(8080));
> }
> }
>
> ~~~~~~~~~~~~
> //Removed Imports
>
> @ChannelPipelineCoverage("one")
> public class ProxyInboundHandler extends SimpleChannelUpstreamHandler {
>
> private volatile Channel outboundChannel;
>
> private volatile boolean readingChunks;
>
> private final StringBuilder responseContent = new StringBuilder();
>
> @Override
> public void messageReceived(ChannelHandlerContext ctx, MessageEvent
> e)
> throws Exception {
> HttpRequest request = null;
>
> if (!readingChunks) {
> request = (HttpRequest) e.getMessage();
>
> URI uri = new URI(request.getUri());
>
> String remoteHost = uri.getHost();
> int remotePort = uri.getPort() == -1 ? 80 :
> uri.getPort();
>
> // //////////////////////////////////////
> //
> ///////////////////////////////////////////////////////////////////
> // Suspend incoming traffic until connected to the
> remote host.
> final Channel inboundChannel = e.getChannel();
> inboundChannel.setReadable(false);
>
> // Start the connection attempt.
> ClientBootstrap cb = new
> ClientBootstrap(Globals.getChannelFactory());
> cb.getPipeline().addLast("handler",
> new
> OutboundHandler(e.getChannel()));
> ChannelFuture f = cb.connect(new
> InetSocketAddress(remoteHost,
> remotePort));
>
> outboundChannel = f.getChannel();
> f.addListener(new ChannelFutureListener() {
> public void operationComplete(ChannelFuture
> future)
> throws Exception {
> if (future.isSuccess()) {
> // Connection attempt
> succeeded:
> // Begin to accept incoming
> traffic.
>
> inboundChannel.setReadable(true);
> } else {
> // Close the connection if
> the connection attempt has
> // failed.
> inboundChannel.close();
> }
> }
> });
>
> if (request.isChunked()) {
> readingChunks = true;
> } else {
> ChannelBuffer content =
> request.getContent();
> if (content.readable()) {
> responseContent.append("CONTENT: "
> +
> content.toString("UTF-8") + "\r\n");
> }
> //writeResponse(request, e);
> }
> }
> }
>
> @Override
> public void channelClosed(ChannelHandlerContext ctx,
> ChannelStateEvent e)
> throws Exception {
> if (outboundChannel != null) {
> closeOnFlush(outboundChannel);
> }
> }
>
> @Override
> public void exceptionCaught(ChannelHandlerContext ctx,
> ExceptionEvent e)
> throws Exception {
> e.getCause().printStackTrace();
> closeOnFlush(e.getChannel());
> }
>
> @ChannelPipelineCoverage("one")
> private class OutboundHandler extends SimpleChannelUpstreamHandler
> {
>
> private final Channel inboundChannel;
>
> OutboundHandler(Channel inboundChannel) {
> this.inboundChannel = inboundChannel;
> }
>
> @Override
> public void messageReceived(ChannelHandlerContext ctx,
> MessageEvent e)
> throws Exception {
> ChannelBuffer msg = (ChannelBuffer) e.getMessage();
> System.out.println("<<< " +
> ChannelBuffers.hexDump(msg));
> inboundChannel.write(msg);
> }
>
> @Override
> public void channelClosed(ChannelHandlerContext ctx,
> ChannelStateEvent e)
> throws Exception {
> closeOnFlush(inboundChannel);
> }
>
> @Override
> public void exceptionCaught(ChannelHandlerContext ctx,
> ExceptionEvent e)
> throws Exception {
> e.getCause().printStackTrace();
> closeOnFlush(e.getChannel());
> }
> }
>
> /**
> * Closes the specified channel after all queued write requests are
> flushed.
> */
> static void closeOnFlush(Channel ch) {
> if (ch.isConnected()) {
> ch.write(ChannelBuffers.EMPTY_BUFFER).addListener(
> ChannelFutureListener.CLOSE);
> }
> }
> }
>
> ~~~~~~~~~~~~~~~~~~~~
> public class Globals {
> // Configure the bootstrap.
> private static Executor executor = null;
>
> // Set up the event pipeline factory.
> private static ClientSocketChannelFactory channelFactory = null;
>
> private Globals() {
> }
>
> /**
> * @return the Channel Factory
> */
> public static synchronized ClientSocketChannelFactory
> getChannelFactory() {
> if (channelFactory == null) {
> channelFactory = new
> NioClientSocketChannelFactory(getExecutor(),
> getExecutor());
> }
>
> return channelFactory;
> }
>
> /**
> * @return the executor
> */
> public static synchronized Executor getExecutor() {
> if (executor == null) {
> executor = Executors.newCachedThreadPool();
> ;
> }
>
> return executor;
> }
> }
>
> Please help me out.
>
> Regards, Naveen
>
>
> Rembert Magri wrote:
>>
>> Hi Trustin,
>>
>> I have been trying to use your Proxy Server Example but it seems I am
>> getting the same error as Dave has already reported
>> (http://markmail.org/message/kb7glbm573el2gg2). I gess it might be a
>> concurrency issue, because when I turn the System.out.printn's off, it
>> seems I get more ClosedChannelExceptions.
>> Eventually I can load the entire redirected page without any problem, but
>> in most cases the error keeps occurring and I aways have to try
>> refreshing. I don't think it happens because of the load (I am
>> redirecting a simple 3-frames html page).
>> Do you think there is any way to solve this problem? I'm currently using
>> Netty just to get this proxy working, and it would be great if I could
>> show my dev team it has better performance AND reliability than Mina, for
>> instance.
>>
>> Thanks,
>> Rembert
>>
>>
>> Trustin Lee wrote:
>>>
>>> Hi folks,
>>>
>>> On popular demand, I added the proxy server example to the trunk:
>>>
>>> http://viewvc.jboss.org/cgi-bin/viewvc.cgi/netty/trunk/src/main/java/org/jboss/netty/example/proxy/
>>>
>>> It's a very simple proxy server that always connects to the same remote
>>> address. It prints out all inbound and outbound traffic in hexadecimal
>>> form, hence named as 'HexDumpProxy'.
>>>
>>> The code is pretty straightforward. Please feel free to comment to make
>>> it more comprehensive!
>>>
>>> Cheers,
>>> Trustin
>>>
>>> PS: I will also write another example that demonstrates the transfer of
>>> large file early next week. ;)
>>>
>>> --
>>> â Trustin Lee, http://gleamynode.net/
>>>
>>>
>>>
>>> _______________________________________________
>>> netty-users mailing list
>>> netty-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>
>>>
>>
>>
>
>
--
View this message in context: http://n2.nabble.com/Proxy-server-example-tp3066604p3478165.html
Sent from the Netty User Group mailing list archive at Nabble.com.
More information about the netty-users
mailing list