我在Java中编写一个HTTP代理,它接受格式错误的HTTP请求,纠正它们,将它们转发到服务器,然后将服务器的响应转发回客户端。但是,我在测试它时遇到了很多麻烦。
我在Red Hat服务器上运行虚拟机上的代理(我有root权限),我正在收听并侦听端口12345.然后在我的机器上,在Firefox中我将转到Options> Connection设置>手动代理配置并输入虚拟机和端口12345的IP地址。
但是,当我在我的虚拟机上运行代理并尝试访问Firefox中的某个站点时,没有任何反应。这是我的代码:
package proxy;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class WebProxy {
public void run() {
try {
toFromClient();
}
catch (IOException e) {
e.printStackTrace();
}
}
public String requestNormalizer(String badRequest) {
return badRequest.replace(badRequest.substring(0, badRequest.indexOf(" ")), badRequest.substring(0, badRequest.indexOf(" ")).toUpperCase());
}
public void toFromClient() throws IOException {
ServerSocket welcome;
Socket client;
String request;
String response;
DataOutputStream outputToClient;
BufferedReader inputFromClient;
boolean listening = true;
welcome = new ServerSocket(12345);
while (listening) {
client = welcome.accept();
inputFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
request = inputFromClient.readLine();
// request = requestNormalizer(request);
response = toFromServer(request);
outputToClient = new DataOutputStream(client.getOutputStream());
outputToClient.writeBytes(response);
}
}
public String toFromServer(String request) throws UnknownHostException, IOException {
Socket server;
String response;
DataOutputStream outputToServer;
BufferedReader inputFromServer;
if (!dnsQuery(request)[1].equals(""))
server = new Socket((InetAddress) dnsQuery(request)[0], (int) dnsQuery(request)[1]);
else
server = new Socket((InetAddress) dnsQuery(request)[0], 80);
outputToServer = new DataOutputStream(server.getOutputStream());
inputFromServer = new BufferedReader(new InputStreamReader(server.getInputStream()));
outputToServer.writeBytes(request);
response = inputFromServer.readLine();
server.close();
return response;
}
public Object[] dnsQuery(String request) throws UnknownHostException {
Object[] addressPort = new Object[2];
String hostname = request.substring(request.indexOf("host") + 6);
hostname = hostname.substring(0, hostname.indexOf("\r"));
if (hostname.contains(":")) {
hostname = hostname.substring(0, hostname.indexOf(":"));
addressPort[1] = hostname.substring(hostname.indexOf(":"));
}
else
addressPort[1] = "";
addressPort[0] = InetAddress.getByName(hostname);
return addressPort;
}
public static void main(String[] args) {
WebProxy wp = new WebProxy();
wp.run();
}
}
我现在不担心修复HTTP请求,所以我在toFromClient()中注释了requestNormalizer()。
我已经确定(通过打印声明)我的代码永远不会超过“client = welcome.accept();”在toFromClient()方法和idles直到我停止它,所以我猜我的程序在尝试连接到Firefox中的网页时从未接收任何连接。我尝试过与端口12345不同的端口,我也能够通过使用Netcat监听该端口,然后在另一个控制台窗口中连接到该端口,成功建立到我的VM上的端口12345的连接,使用Netcat。此外,我无法从我自己的机器(我使用的是Firefox,而不是VM)远程登录到VM。
有谁知道问题可能是什么?它是代码,还是像防火墙等其他问题?请告诉我,我未能充分澄清某些内容,或者是否有人需要任何其他信息。
提前致谢!
答案 0 :(得分:0)
您是否尝试使用同一台计算机上安装的链接连接到此代理?它可能 帮助您找出什么东西,阻止您的虚拟机和Firefox之间的通信。
您可以通过yum install links
安装链接(或elinks)(抱歉,我现在附近没有Red Hat)。
如果您能够通过链接进行连接,请查看http://www.techotopia.com/index.php/Basic_RHEL_6_Firewall_Configuration