2

私はプロキシサーバーの次のコードを持っています。正しいアプローチですか?共同で展開した場合、これは負荷/トラフィックを処理できますか??

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)
        {
        }
    }
}
4

2 に答える 2

1

原則的にはほぼ正しいように見えますが、スループットの最大化、復元力の向上などに関する指針については、TCPプロキシなどのオープンソースバージョンを確認する必要があります。

于 2009-08-12T15:15:45.897 に答える
1

[OK...十分ないじめ:-)]

ただし、機能するはずです。

  1. ProxyクラスのSystem.errに出力するものは、壊れている可能性があります。(前に言ったように、すべてのWebページがASCIIでエンコードされていると仮定することはできません!!)
  2. 特に高スループットが必要な場合は、一度に50バイトをはるかに超える値を読み取る必要があります。
  3. メインクラスは、スレッドを作成して破棄するのではなく、おそらくスレッドプールを使用する必要があります。また、常に許可するスレッドの数に上限を設定する必要があります。
  4. おそらく、応答を配信するのに長い時間がかかるサーバーなどについて何かをする必要があります。

最後に、これに応えて:

商業的に展開された場合、これは負荷/トラフィックを処理できますか?

このプログラムでどれだけの負荷をポンプできるかを言うことは不可能です。まず、プロセッサとネットワークインターフェイスハードウェアによって異なります。

于 2009-08-12T15:16:47.453 に答える