Java中转发HTTP请求的socket
因此,基本上我正在编写一个简单的代理,它接受HTTP请求,其中方法名是小写的,我必须将它们大写,并将它们转发给服务器。不过,转发到服务器部分是我遇到的问题。在我的代码中,这是“forwardToServer”方法。我已经成功地规范了请求,获取了主机的IP地址,但是当我尝试将请求发送到主机时,会出现连接超时异常。我对socket编程非常陌生,所以我真的不知道发生了什么
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));
}
# 1 楼答案
套接字级别(而非HTTP级别)出现了“连接超时”错误,这意味着网络级别存在一些问题,导致无法建立TCP连接
这并不是说在你使用的IP/端口上没有任何连接在监听。。。因为这会导致“连接被拒绝”错误
这(可能)不是因为你有一个虚假的主机名或IP地址,因为这会导致不同的消息
最可能的解释是,连接被客户端、服务器或两者之间的某个地方的防火墙阻止
尝试使用web浏览器连接到同一主机/端口。。。或者一些命令行工具,允许您打开一个简单的TCP/IP连接。(在Linux上,
telnet
命令通常用于此操作…)请注意,stacktrace表示您正在WebProxy类的
main
方法中创建一个套接字对象。。。但你还没有向我们展示那套代码。根据stacktrace,事实上,您包含的代码中没有一个与您当前的问题直接相关