我在java中编写了一个简单的HTTP代理。代码如下:
public class SampleProxy {
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 ProxyThread(serverSocket.accept()).start();
}
serverSocket.close();
}
}
class ProxyThread extends Thread {
private final Socket clientSocket;
public ProxyThread(Socket socket) {
this.clientSocket = socket;
}
public void run() {
try {
String parts[];
// Read request
InputStream incomingIS = clientSocket.getInputStream();
int incomingLen = incomingIS.available();
byte[] b = new byte[8196];
int len = incomingIS.read(b);
if (len > 0) {
System.out.println("The Request is : \n" + new String(b, 0, len) + "\n*********\n");
Socket socket = new Socket("localhost", 80);
OutputStream outgoingOS = socket.getOutputStream();
outgoingOS.write(b, 0, len);
OutputStream incomingOS = clientSocket.getOutputStream();
InputStream outgoingIS = socket.getInputStream();
int length;
//Read from server
byte[] b2=new byte[8196];
length = outgoingIS.available();
outgoingIS.read(b2);
incomingOS.write(b2, 0, b2.length);
incomingOS.close();
outgoingIS.close();
outgoingOS.close();
incomingIS.close();
socket.close();
} else {
incomingIS.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception ex) {
Logger.getLogger(ProxyThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如图所示,客户端在端口1234处请求,代理将请求转发给服务器并获取响应,然后将响应返回给客户端。
在正常情况下,这很好用,但是,我尝试使用shell脚本测试相同的高流量情况,该脚本发送多个(大约50个)POST请求,一个接一个,并发现对于某些请求,只收到标题。 POST数据被省略,但Content-Length
显示了应该发送的变量的适当长度。对于特定请求,这不会发生,但随机发生,可能是50个请求中的3个或4个。
然而,GET请求似乎不存在相同的错误。
有关实际导致错误的任何建议吗?
答案 0 :(得分:0)
这里常见的错误。滥用available(),无法正确实现HTTP协议。您需要彻底阅读RFC 2616,尤其是有关请求和响应长度的部分;并重新读取InputStream.available()的Javadoc,在这里你会发现一个特殊的警告,不要像你在这里一样使用它。