Webproxy i Java
Jag försöker göra en webproxy i Java baserat på koden från
http://www.java2s.com/Code/Java/Network-Protocol/Asimpleproxy...
Men jag har ett problem med när jag hämtar remote host.
Jag kan hämta websidor genom proxyn om jag sätter ip-adressen till en websida direkt i koden, men då kan jag bara hämta den sidan och jag vill så klart kunna besöka alla siter.
Jag hittade ett sätt att för programmet att läsa in adressen själv, men då får jag time out på alla anslutningsförsök och jag vet inte varför.
Den fungerade koden med fast adress:
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JTextArea;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class ProxyThread extends Thread {
private String host;
private int remoteport;
private int localport;
private JTextArea log;
public ProxyThread(int remoteport, int localport, JTextArea log) {
this.remoteport = remoteport;
this.localport = localport;
this.log = log;
}
/**
* runs a single-threaded proxy server on the specified local port. It never
* returns.
*/
public void run() {
while (true) {
try {
InetAddress addr = InetAddress.getLocalHost();
// Get IP Address
byte[] ipAddr = addr.getAddress();
// Get hostname
this.host = addr.getHostName();
} catch (UnknownHostException e) {
}
// Create a ServerSocket to listen for connections with
ServerSocket ss;
try {
ss = new ServerSocket(localport);
final byte[] request = new byte[1024];
byte[] reply = new byte[4096];
while (true) {
Socket client = null, server = null;
try {
// Wait for a connection on the local port
client = ss.accept();
final InputStream streamFromClient = client
.getInputStream();
final OutputStream streamToClient = client
.getOutputStream();
host = "74.125.77.147";
try {
server = new Socket(host, remoteport);
} catch (IOException e) {
log.append("\nProxy server cannot connect to "
+ host + ":" + remoteport + ":\n" + e
+ "\n");
System.out.println("\nProxy server cannot connect to "
+ host + ":" + remoteport + ":\n" + e
+ "\n");
PrintWriter out = new PrintWriter(streamToClient);
out.print("Proxy server cannot connect to " + host
+ ":" + remoteport + ":\n" + e + "\n");
out.flush();
client.close();
continue;
}
// Get server streams.
final InputStream streamFromServer = server
.getInputStream();
final OutputStream streamToServer = server
.getOutputStream();
System.out.println("Anslöt, server Inetaddress: " +
server.getInetAddress().toString());
// a thread to read the client's requests and pass them
// to the server. A separate thread for asynchronous.
Thread t = new Thread() {
public void run() {
int bytesRead;
try {
while ((bytesRead = streamFromClient
.read(request)) != -1) {
streamToServer.write(request, 0,
bytesRead);
streamToServer.flush();
}
} catch (IOException e) {
log.append("\n" + e.toString());
}
// the client closed the connection to us, so
// close our
// connection to the server.
try {
streamToServer.close();
} catch (IOException e) {
log.append("\n" + e.toString());
}
}
};
// Start the client-to-server request thread running
t.start();
// Read the server's responses
// and pass them back to the client.
int bytesRead;
try {
while ((bytesRead = streamFromServer.read(reply)) != -1) {
streamToClient.write(reply, 0, bytesRead);
streamToClient.flush();
}
} catch (IOException e) {
log.append("\n" + e.toString());
}
// The server closed its connection to us, so we close
// our
// connection to our client.
streamToClient.close();
} catch (IOException e) {
log.append("\n" + e.toString());
} finally {
try {
if (server != null)
server.close();
if (client != null)
client.close();
} catch (IOException e) {
log.append("\n" + e.toString());
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
log.append("\n" + e.toString());
}
}
}
Google hämtas i browsern och i consolen står det:
Anslöt, server Inetaddress: /74.125.77.147
Om jag byter ut host = "74.125.77.147"; i koden ovan mot:
final InputStream streamFromClient = client
.getInputStream();
final OutputStream streamToClient = client
.getOutputStream();
BufferedReader in = new BufferedReader(
new InputStreamReader(streamFromClient));
String line = in.readLine();
int lastSpace = line.lastIndexOf(' ');
// Läs urlen från GET
URL url = new URL(line.substring(4, lastSpace));
host = url.getHost();
System.out.println(host.toString());
Så får jag connection reset i browsern och i consolen står det:
www.google.se
Anslöt, server Inetaddress: www.google.se/66.102.13.106
server = new Socket(host, remoteport); måste fungera i båda fallen då jag inte får syso-meddelandet i catch-delen.
Men sen går något fel eftersom jag får connection reset.