Прокси-сервер в 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, для указателей по максимизации пропускной способности, повышению устойчивости и т. Д.
[ОК... хватит дразнить:-) ]
Похоже, это должно работать, хотя:
- Материал, который вы печатаете в System.err в классе Proxy, может быть искажен. (Как я уже говорил, вы не можете просто предположить, что каждая веб-страница закодирована в ASCII!!)
- Вы, вероятно, должны читать намного больше, чем 50 байтов за раз.... особенно если вы хотите высокую пропускную способность.
- Ваш основной класс, вероятно, должен использовать пул потоков, а не создавать и выбрасывать потоки. И вам, вероятно, следует установить верхнюю границу для количества потоков, которые вы хотите разрешить в любой момент времени.
- Вам, вероятно, нужно что-то делать с серверами, для доставки ответов которых требуется много времени, и так далее.
Наконец, в ответ на это:
Сможет ли это справиться с нагрузкой / трафиком, если она будет развернута на коммерческой основе?
Невозможно сказать, какую нагрузку вы могли бы прокачать через эту программу. Для начала, это будет зависеть от вашего процессора и аппаратного интерфейса сети.