📄 mdragonfly.java
字号:
package net.jumperz.app.MDragonfly;
import java.io.*;
import java.util.*;
import java.net.*;
import net.jumperz.net.*;
import net.jumperz.security.MSecurityUtil;
import net.jumperz.util.*;
import java.security.cert.*;
import java.security.cert.Certificate;
import java.security.*;
import java.security.spec.*;
import javax.net.ssl.SSLSocket;
public final class MDragonfly
{
private MThreadPool threadPool;
private String logFileName;
private int threadCount;
private int port;
private int targetPort;
private String host;
private String targetHost;
private static MDragonfly instance;
private static final String USAGE = "Usage: java net.jumperz.app.MDragonfly.MDragonfly CONFIGURATION_FILE";
//--------------------------------------------------------------------------------------
public static MDragonfly getInstance()
{
return instance;
}
//--------------------------------------------------------------------------------------
public static void main( String[] args )
throws Exception
{
if( args.length == 1 )
{
instance = new MDragonfly( args[ 0 ]);
instance.start();
}
else
{
System.out.println( USAGE );
return;
}
}
//--------------------------------------------------------------------------------------
private MDragonfly( 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( "Dragonfly@JUMPERZ.NET started. local=" + host + ":" + port + " remote=" + targetHost + ":" + targetPort );
KeyStore keyStore = generateKeyStore();
MSslAcceptor sslAcceptor = new MSslAcceptor( keyStore, host, port );
MSslAcceptorObserver observer = new MSslAcceptorObserver( sslAcceptor );
sslAcceptor.register1( observer );
threadPool = new MThreadPool( threadCount );
threadPool.addCommand( sslAcceptor );
}
//--------------------------------------------------------------------------------------
public void connect( SSLSocket clientSideSocket )
{
MConnector connector = new MConnector( targetHost, targetPort );
MConnectorObserver observer = new MConnectorObserver( connector, clientSideSocket );
connector.register1( observer );
threadPool.addCommand( connector );
}
//--------------------------------------------------------------------------------------
public void startSession( SSLSocket clientSideSocket, Socket serverSideSocket )
{
try
{
MStreamConnector downStreamConnector
= new MStreamConnector( serverSideSocket.getInputStream(), clientSideSocket.getOutputStream() );
MStreamConnector upStreamConnector
= new MStreamConnector( clientSideSocket.getInputStream(), serverSideSocket.getOutputStream() );
MAccessLogger accessLogger =
new MAccessLogger
(
clientSideSocket,
clientSideSocket.getInetAddress().getHostAddress(),
clientSideSocket.getPort(),
serverSideSocket.getLocalAddress().getHostAddress(),
serverSideSocket.getLocalPort(),
upStreamConnector
);
upStreamConnector.register1( accessLogger );
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();
}
}
}
//--------------------------------------------------------------------------------------
private KeyStore generateKeyStore()
throws Exception
{
MConfig config = MConfig.getInstance();
String certificateFileName = config.getCertificateFileName();
String privateKeyFileName = config.getPrivateKeyFileName();
String algorithm = config.getAlgorithm();
return MSecurityUtil.generateKeyStore( certificateFileName, privateKeyFileName, algorithm );
}
//--------------------------------------------------------------------------------------
public void exit()
{
threadPool.stop();
System.exit( 0 );
}
//--------------------------------------------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -