Cześć, chciałem napisać bardzo prosty proxy server, jednowątkowy bez żadnych udziwnień...w internecie można znaleźć wiele proxy serwerów które albo nie działają...albo są nazbyt skomplikowane.. chodzi mi o stworzenie prostego proxy, który po prostu przekazuje kompuniakaty z przeglądarki do serwera www i z powrotem.
Tak więc napisałem kawałek kodu w javie i nie wiem do końca czemu program przekazuje tylko jeden komunikat, odbiera jeden i zawiesza się... oto kod:
import java.io.*;
import java.net.*;
import java.util.*;
import sun.net.www.MessageHeader;
public class Proxy{
public Proxy(){
try {
run(8081);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]){
new Proxy();
}
public void run(int proxyPort) throws Exception{
//Serwer połaczenie przeglądarka <-> proxy
ServerSocket serverToBrowser = new ServerSocket(proxyPort);
Socket client = serverToBrowser.accept();
BufferedInputStream clientIn = new BufferedInputStream(client.getInputStream());
BufferedOutputStream clientOut = new BufferedOutputStream(client.getOutputStream());
while (true){
//Odbieram dane z przeglądarki
byte fromBrowser[] = read(clientIn);
InputStream is = new ByteArrayInputStream(fromBrowser);
MessageHeader msgServer = new MessageHeader(is);
String host = msgServer.findValue("Host");
//Serwer połączenie proxy <-> www, za każdym razem nowe połączenie
Socket serverToWWW = new Socket(host, 80);
BufferedInputStream serverIn = new BufferedInputStream(serverToWWW.getInputStream());
BufferedOutputStream serverOut = new BufferedOutputStream(serverToWWW.getOutputStream());
//Wysyłam dane do wwww
serverOut.write(fromBrowser);
serverOut.flush();
System.out.println(new String(fromBrowser));
//Odbieram dane z www
byte fromWWW[] = read(serverIn);
InputStream is2 = new ByteArrayInputStream(fromWWW);
MessageHeader msgWWW = new MessageHeader(is2);
String connection = msgServer.findValue("Connection");
//Wysyłam dane do przeglądarki
clientOut.write(fromWWW);
clientOut.flush();
System.out.println(new String(fromWWW));
//zamykam połączenie proxy <-> www
serverToWWW.close();
}
}
//Czyta dane ze strumienia i zwraca tablicę bajtów
public byte[] read(InputStream clientIn) throws Exception{
byte[] buffer = new byte[3024];
byte[] fromBrowser = null;
int bytesRead;
//Czekaj dopuki nie ma danych w strumieniu
while ( (bytesRead = clientIn.read(buffer))==0 );
fromBrowser = new byte[bytesRead];
//Kopiuj dane z bufora do tablicy
fromBrowser=Arrays.copyOf(buffer, bytesRead);
return fromBrowser;
}
}
Podejrzewam, że kłopot tkwi w mojej funkcji czytającej ze strumienia dane... która przy braku odpowiedzi blokuje program...
Proszę o sugestie i podpowiedzi jak rozwiązać problem w programie.