Simple proxy web en Java
Je suis en train d'écrire un simple proxy web en java qui accepte à la fois les GET et POST demandes. J'ai écrit le code suivant:
import java.net.*;
import java.io.*;
import java.nio.CharBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
public class InterceptionProxy2 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
int port = 1234;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
System.out.println("Port Error");
System.exit(-1);
}
while (listening) {
new ProxyThread2(serverSocket.accept()).start();
}
serverSocket.close();
}
}
class ProxyThread2 extends Thread {
private Socket clientSocket = null;
private Socket serverSocket = null;
public ProxyThread2(Socket socket) {
super("ProxyThread2");
this.clientSocket = socket;
}
public void run() {
//Stream to put data to the browser
PrintWriter outGoing = null;
try {
outGoing = new PrintWriter(clientSocket.getOutputStream(), true);
//Stream to get data from the browser
BufferedReader inComing = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String incomingRequest;
String url = "";
String request = "";
String response = "";
//Take the incoming request
char[] buf = new char[8196]; //8196 is the default max size for GET requests in Apache
int bytesRead = inComing.read(buf); //BytesRead need to be calculated if the char buffer contains too many values
request = new String(buf, 0, bytesRead);
System.out.println("Request");
System.out.println(request);
//Create a new socket for connecting to destination server
serverSocket = new Socket("localhost", 80);
PrintWriter pOut = new PrintWriter(serverSocket.getOutputStream(), true);
//Reader for response from destination server
BufferedReader pIn = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
//Put data into the new socket(to the apache server) and receive its output
pOut.print(request);
pOut.flush();
bytesRead = pIn.read(buf);
//Check if data is read
if (bytesRead > 0) {
response = new String(buf, 0, bytesRead);
}
System.out.println("Response");
System.out.println(response);
//Put data back into the original client socket
outGoing.write(response);
} catch (IOException ex) {
Logger.getLogger(ProxyThread2.class.getName()).log(Level.SEVERE, null, ex);
} finally {
outGoing.close();
}
}
}
Correctement le système imprime la demande et de réponse de la sortie, mais, le proxy ne fournit pas la réponse au navigateur. Il n'y a rien de mal avec le flux sortant de définition? Ou devrais-je créer un nouveau socket pour envoyer des données vers le navigateur?
Si une réponse a été utile, vous pouvez accepter.
OriginalL'auteur Mkl Rjv | 2013-09-19
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de créer une autre instance de
java.net.ServerSocket
. Parce que vous devez vous connecter à port80
, vous êtes un client.par exemple:
vous pouvez dire merci en acceptant la réponse
OriginalL'auteur Paul Vargas
Votre Code de travail pour de simples fichiers texte ou html.
Il n'y a qu'un seul problème, seul l'en-tête HTTP sont des données de texte tout dans le corps du message HTTP pourrait être simple octet de données comme des images.
Vous ne devriez pas utiliser le PrintWriter et/ou de Chaînes de caractères à convertir la réponse.
Vous devez simplement suivre les octets de la mémoire tampon, vous obtiendrez à partir du Serveur.
Il suffit de convertir le tampon d'octets que si vous voulez vous montrer le message HTTP.
Dans ce cas, vous devez analyser l'en-tête http de la première et de vérifier le Type de Contenu, si l'en-tête comme text/xml, text/html ou text/plain etc. vous pouvez charger le corps dans un toute la Chaîne de l'objet sinon, vous devez utiliser un tableau d'octets de la mémoire tampon.
OriginalL'auteur garvey