⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remoterequesthandlertunnel.java

📁 这是linux下ssl vpn的实现程序
💻 JAVA
字号:
package com.sslexplorer.forwarding;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.maverick.multiplex.MultiplexedConnection;
import com.sslexplorer.boot.RequestHandlerTunnel;
import com.sslexplorer.core.CoreServlet;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class RemoteRequestHandlerTunnel implements RequestHandlerTunnel {

    static Log log = LogFactory.getLog(RemoteRequestHandlerTunnel.class);

    MultiplexedConnection con;
    String addr;
    int port;
    String hostToConnect;
    int portToConnect;
    ServerSocket server;
    Thread t;
    VPNListeningSocket vpnSocket;
    public RemoteRequestHandlerTunnel(String addr,
                                    int port,
                                    String hostToConnect,
                                    int portToConnect,
          VPNListeningSocket vpnSocket) throws IOException {
        this.addr = addr;
        this.port = port;
        this.hostToConnect = hostToConnect;
        this.portToConnect = portToConnect;
        this.vpnSocket = vpnSocket;
    }

    public void tunnel(InputStream in, OutputStream out) {

            try {

                vpnSocket.addListener(new Runnable() {
                   public void run() {
                       close();
                   }
                });

                this.con = new MultiplexedConnection(10, 0, 0, in, out, null);

                server = new ServerSocket(port, 50, InetAddress.getByName(addr));
                Socket socket;
                while ((socket = server.accept()) != null) {

                    RemoteForwardingChannel channel = new RemoteForwardingChannel(socket,
                            hostToConnect, portToConnect, vpnSocket);
                    try {
                        con.openChannel(channel);

                    } catch(IOException ex) {
                        // Channel failed to open
                    	if (log.isInfoEnabled())
                    		log.info("Failed to open remote forwarding channel", ex);
                        break;
                    }
                }
            } catch (IOException ex) {
            	if (log.isInfoEnabled())
            		log.info("ServerSocket failed to bind or accept", ex);
            } finally {
                close();
            }
    }


    private synchronized void closeSocket() {

    	if (log.isInfoEnabled())
    		log.info("Closing socket " + addr + ":" + port);
        if (server != null) {

            try {
                server.close();
            } catch (Throwable t) {}

            server = null;
        }

    }

    public void close() {

    	if (log.isInfoEnabled())
    		log.info("Closing remote forwarding handler " + addr + ":" + port);

        vpnSocket.closeActiveTunnels();
        closeSocket();
        con.disconnect(1, "Multiplexed connection tunnel is closing");

        CoreServlet.getServlet().getConnectProxyMethodHandler().releasePort(port);

    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -