【发布时间】:2014-04-02 08:58:30
【问题描述】:
所以基本上我正在编写一个简单的代理,它接受 HTTP 请求,其中方法名称是小写的,我必须将它们大写并将它们转发到服务器。不过,转发到服务器部分是我遇到的麻烦。在我的代码中,这就是“forwardToServer”方法。我已经设法规范化请求,获取主机的 IP 地址,但是当我尝试将请求发送到主机时,出现连接超时异常。我对套接字编程很陌生,所以我真的不知道发生了什么。
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 String requestNormalizer(String badRequest) {
return badRequest.replace(badRequest.substring(0, badRequest.indexOf(" ")), badRequest
.substring(0, badRequest.indexOf(" ")).toUpperCase());
}
public void requestFromClient(String badRequest) throws IOException {
ServerSocket welcome = new ServerSocket(9001);
while (true) {
Socket connection = welcome.accept();
BufferedReader clientInput = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
}
}
public void fowrardToServer(String request) throws UnknownHostException, IOException {
Socket client;
if (!dnsQuery(request)[1].equals(""))
client = new Socket((InetAddress) dnsQuery(request)[0], (int) dnsQuery(request)[1]);
else
client = new Socket((InetAddress) dnsQuery(request)[0], 9001);
DataOutputStream output = new DataOutputStream(client.getOutputStream());
BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
output.writeBytes(request);
System.out.println(input.readLine());
}
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;
}
这是异常的堆栈跟踪:
Exception in thread "main" java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at proxy.WebProxy.main(WebProxy.java:99)
这是我用于测试目的的 GET 请求:
GET http://www.uga.edu/ HTTP/1.1
Host: www.uga.edu
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:18.0) Gecko/20100101
Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
提前致谢!
编辑: 我用来测试的代码很常规,我只是在测试forwardToServer方法
public static void main(String[] args) throws IOException {
WebProxy wp = new WebProxy();
String request = "get http://www.uga.edu/ HTTP/1.1\r\nhost: www.google.com\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate";
wp.forwardToServer(wp.requestNormalizer(request));
}
【问题讨论】: