📄 mtcpproxy.java
字号:
package net.jumperz.app.MTcpProxy;
import java.io.*;
import java.util.*;
import java.net.*;
import net.jumperz.net.*;
import net.jumperz.util.*;
public final class MTcpProxy
{
private MThreadPool threadPool;
private String logFileName;
private int threadCount;
private int port;
private int targetPort;
private String host;
private String targetHost;
private static MTcpProxy instance;
private static final String USAGE = "Usage: java net.jumperz.app.MTcpProxy.MTcpProxy CONFIGURE_FILE";
//--------------------------------------------------------------------------------------
public static MTcpProxy getInstance()
{
return instance;
}
//--------------------------------------------------------------------------------------
public static void main( String[] args )
throws Exception
{
if( args.length == 1 )
{
instance = new MTcpProxy( args[ 0 ]);
instance.start();
}
else
{
System.out.println( USAGE );
return;
}
}
//--------------------------------------------------------------------------------------
private MTcpProxy( String configFileName )
throws Exception
{
loadConfig( configFileName );
MStandardLogger.getInstance().addStream( new FileOutputStream( new File( logFileName ), true ) );
MStandardLogger.getInstance().addStream( System.out );
}
//--------------------------------------------------------------------------------------
private void loadConfig ( String configFileName )
throws Exception
{
MConfig config = MConfig.getInstance();
config.load( configFileName );
logFileName = config.getLogFileName();
threadCount = config.getThreadCount();
port = config.getPort();
targetPort = config.getTargetPort();
host = config.getHost();
targetHost = config.getTargetHost();
}
//--------------------------------------------------------------------------------------
public void start()
throws Exception
{
MStandardLogger.getInstance().log( "TcpProxy@JUMPERZ.NET started. local=" + host + ":" + port + " remote=" + targetHost + ":" + targetPort );
MMultiAcceptor acceptor = new MMultiAcceptor( host, port );
MAcceptorObserver observer = new MAcceptorObserver( acceptor );
acceptor.register1( observer );
threadPool = new MThreadPool( threadCount );
threadPool.addCommand( acceptor );
}
//--------------------------------------------------------------------------------------
public void connect( Socket clientSideSocket )
{
MConnector connector = new MConnector( targetHost, targetPort );
MConnectorObserver observer = new MConnectorObserver( connector, clientSideSocket );
connector.register1( observer );
threadPool.addCommand( connector );
}
//--------------------------------------------------------------------------------------
public void startSession( Socket clientSideSocket, Socket serverSideSocket )
{
try
{
MStreamConnector downStreamConnector
= new MStreamConnector( serverSideSocket.getInputStream(), clientSideSocket.getOutputStream() );
MStreamConnector upStreamConnector
= new MStreamConnector( clientSideSocket.getInputStream(), serverSideSocket.getOutputStream() );
MStandardLogger.getInstance().log
(
clientSideSocket.getInetAddress().getHostAddress() + ":" +
clientSideSocket.getPort() + " " +
serverSideSocket.getLocalAddress().getHostAddress() + ":" +
serverSideSocket.getLocalPort()
);
threadPool.addCommand( downStreamConnector );
threadPool.addCommand( upStreamConnector );
}
catch( IOException e )
{
e.printStackTrace();
try
{
clientSideSocket.close();
}
catch( IOException e2 )
{
e2.printStackTrace();
}
try
{
serverSideSocket.close();
}
catch( IOException e2 )
{
e2.printStackTrace();
}
}
}
//--------------------------------------------------------------------------------------
public void exit()
{
threadPool.stop();
System.exit( 0 );
}
//--------------------------------------------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -