试用mina内网转发

1.main方法启动。意思是访问本地的9000端口,则转发到127.0.0.1:80上了。 

package com;

import java.net.InetSocketAddress;

import org.apache.mina.core.service.IoConnector;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
 * (<b>Entry point</b>) Demonstrates how to write a very simple tunneling proxy
 * using MINA. The proxy only logs all data passing through it. This is only
 * suitable for text based protocols since received data will be converted into
 * strings before being logged.
 * <p>
 * Start a proxy like this:<br>
 * <code>org.apache.mina.example.proxy.Main 12345 www.google.com 80</code><br>
 * and open <a href="http://localhost:12345">http://localhost:12345</a> in a
 * browser window.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class MainDemo {

	public static void main(String[] args) throws Exception {
		
		
		// Create TCP/IP acceptor.
		NioSocketAcceptor acceptor = new NioSocketAcceptor();

		// Create TCP/IP connector.
		IoConnector connector = new NioSocketConnector();

		// Set connect timeout.
		connector.setConnectTimeoutMillis(30 * 1000L);

		ClientToProxyIoHandler handler = new ClientToProxyIoHandler(connector,
				new InetSocketAddress("127.0.0.1", 80));

		// Start proxy.
		acceptor.setHandler(handler);
		acceptor.bind(new InetSocketAddress(9000));

	}

}

2.其他类

package com;
 
 import java.nio.charset.Charset;
 
 import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
 
 /**
  * Base class of {@link org.apache.mina.core.service.IoHandler} classes which handle
  * proxied connections.
  *
  * @author <a href="http://mina.apache.org">Apache MINA Project</a>
  */
 public abstract class AbstractProxyIoHandler extends IoHandlerAdapter {
     private static final Charset CHARSET = Charset.forName("iso8859-1");
     public static final String OTHER_IO_SESSION = AbstractProxyIoHandler.class.getName()+".OtherIoSession";
 
     
     /**
      * {@inheritDoc}
      */
     @Override
     public void sessionCreated(IoSession session) throws Exception {
         session.suspendRead();
         session.suspendWrite();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
     public void sessionClosed(IoSession session) throws Exception {
         if (session.getAttribute( OTHER_IO_SESSION ) != null) {
             IoSession sess = (IoSession) session.getAttribute(OTHER_IO_SESSION);
             sess.setAttribute(OTHER_IO_SESSION, null);
             sess.closeOnFlush();
             session.setAttribute(OTHER_IO_SESSION, null);
         }
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
     public void messageReceived(IoSession session, Object message)
             throws Exception {
         IoBuffer rb = (IoBuffer) message;
         IoBuffer wb = IoBuffer.allocate(rb.remaining());
         rb.mark();
         wb.put(rb);
         wb.flip();
         ((IoSession) session.getAttribute(OTHER_IO_SESSION)).write(wb);
         rb.reset();
         System.out.println(rb.getString(CHARSET.newDecoder()));
     }
 }
package com;

import java.net.SocketAddress;

import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;

/**
 * Handles the client to proxy part of the proxied connection.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class ClientToProxyIoHandler extends AbstractProxyIoHandler {
	private final ServerToProxyIoHandler connectorHandler = new ServerToProxyIoHandler();

	private final IoConnector connector;

	private final SocketAddress remoteAddress;

	public ClientToProxyIoHandler(IoConnector connector, SocketAddress remoteAddress) {
		this.connector = connector;
		this.remoteAddress = remoteAddress;
		connector.setHandler(connectorHandler);
	}

	@Override
	public void sessionOpened(final IoSession session) throws Exception {

		connector.connect(remoteAddress).addListener(new IoFutureListener<ConnectFuture>() {
			public void operationComplete(ConnectFuture future) {
				try {
					future.getSession().setAttribute(OTHER_IO_SESSION, session);
					session.setAttribute(OTHER_IO_SESSION, future.getSession());
					IoSession session2 = future.getSession();
					session2.resumeRead();
					session2.resumeWrite();
				} catch (RuntimeIoException e) {
					// Connect failed
					session.closeNow();
				} finally {
					session.resumeRead();
					session.resumeWrite();
				}
			}
		});
	}
}
package com;


  
  /**
   * Handles the server to proxy part of the proxied connection.
   *
   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
   */
  public class ServerToProxyIoHandler extends AbstractProxyIoHandler {
  }

就这四个,实测有效。原理不知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值