Прокси-сервер в Java

У меня есть следующий код прокси-сервера. Есть ли правильный подход? Сможет ли это отрегулировать загрузку / трафик, если его развернуть коммерчески??

package proxyserver;


import com.sun.corba.se.spi.activation.Server;
import java.net.* ;
import java.io.* ;
import java.lang.* ;
import java.util.* ;



/**
 *
 * @author user
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    // Variable to track if an error occurred
boolean errorOccurred = false;

//Variables for the host and port parameters


    public static void main(String[] args) {
        // TODO code application logic here

        int localPort = -1;
        int remotePort = -1;
        String remoteHost = "www.youtube.com";

        System.out.print("dwdsw");


        Integer parseLocalPort = new Integer(555);
        Integer parseRemotePort = new Integer(80);
        localPort =80 ;

       remotePort = 80;

        //Create a listening socket at proxy

ServerSocket server = null;
try
{
    server = new ServerSocket(localPort);
}

catch(IOException e)
{
    System.err.println("Error: " + e.getMessage());
    System.exit(-1);
}

//Loop to listen for incoming connection,
//and accept if there is one

Socket incoming = null;
Socket outgoing = null;

while(true)
{
    try
    {
        // Create the 2 sockets to transmit incoming
        // and outgoing traffic of proxy server
        incoming = server.accept();
        outgoing = new Socket(remoteHost, remotePort);

        // Create the 2 threads for the incoming
        // and outgoing traffic of proxy server
        ProxyThread thread1 = new ProxyThread(incoming, outgoing);
        thread1.start();

        ProxyThread thread2 = new ProxyThread(outgoing, incoming);
        thread2.start();
    }
    catch (UnknownHostException e)
    {
        System.err.println("Error: Unknown Host " + remoteHost);
        System.exit(-1);
    }
    catch(IOException e)
    {
        //continue
        System.exit(-2);;
    }
}




    }

}

теперь прокси класс

package proxyserver;

/**
 *
 * @author user
 */
import java.net.* ;
import java.io.* ;
import java.lang.* ;
import java.util.* ;

class ProxyThread extends Thread
{
    Socket incoming, outgoing;

    ProxyThread(Socket in, Socket out)
    {
        incoming = in;
        outgoing = out;
    }

    // Overwritten run() method of thread,
    // does the data transfers
    public void run()
    {
        byte[] buffer = new byte[5000];
        int numberRead = 0;
        OutputStream toClient;
        InputStream fromClient;

        try{
            toClient = outgoing.getOutputStream();
            fromClient = incoming.getInputStream();

            while(true)
            {
                numberRead = fromClient.read(buffer, 0, 50);
                if(numberRead == -1)
                {
                    incoming.close();
                    outgoing.close();
                }
                String st = new String(buffer,"US-ASCII");
                System.out.println("\n\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\nXXXXXXXXXXXXXXXX\n\n" + st);


                toClient.write(buffer, 0, numberRead);
            }
        }
        catch(IOException e)
        {
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
        }
    }
}

2 ответа

В принципе все выглядит правильно, но вы должны взглянуть на версию с открытым исходным кодом, такую ​​как TCP Proxy, для указателей по максимизации пропускной способности, повышению устойчивости и т. Д.

[ОК... хватит дразнить:-) ]

Похоже, это должно работать, хотя:

  1. Материал, который вы печатаете в System.err в классе Proxy, может быть искажен. (Как я уже говорил, вы не можете просто предположить, что каждая веб-страница закодирована в ASCII!!)
  2. Вы, вероятно, должны читать намного больше, чем 50 байтов за раз.... особенно если вы хотите высокую пропускную способность.
  3. Ваш основной класс, вероятно, должен использовать пул потоков, а не создавать и выбрасывать потоки. И вам, вероятно, следует установить верхнюю границу для количества потоков, которые вы хотите разрешить в любой момент времени.
  4. Вам, вероятно, нужно что-то делать с серверами, для доставки ответов которых требуется много времени, и так далее.

Наконец, в ответ на это:

Сможет ли это справиться с нагрузкой / трафиком, если она будет развернута на коммерческой основе?

Невозможно сказать, какую нагрузку вы могли бы прокачать через эту программу. Для начала, это будет зависеть от вашего процессора и аппаратного интерфейса сети.

Другие вопросы по тегам