我是Java语言的新手,但在其他技术方面有很好的经验。
现在我正致力于创建代理服务器,我已经提出了似乎适用于单个请求的代码,但是当我尝试打开一些加载了大量html
的{{1}}页面时1}},styles
等,部分请求被中止(这就是firebug告诉我的)
因此,将尝试简化代码并尽可能详细地显示确切的问题
这是主要课程:
images
这是处理每个请求的RequestProcess的代码
public class ProxyThread {
public static void main(String[] args) {
ProxyThread Proxy = new ProxyThread();
Proxy.start();
}
public void start() {
ServerSocket server = new ServerSocket(this.portNumber, 1);
while(true) {
Socket serverClient = server.accept();
this._threads[threadCount] = new Thread( new RequestProcess( serverClient, threadCount++ ));
}
}
}
这是处理请求并将其发送到实际服务器的类
public class RequestProcess implements Runnable {
public void start() throws InterruptedException {
this.serverIn = new BufferedReader( new InputStreamReader( this.serverClient.getInputStream() ) );
this.serverOut = this.serverClient.getOutputStream() ;
String currentBuffer;
String request = "";
String host = "";
int port = 0;
while ((currentBuffer = this.serverIn.readLine()) != null) {
if (currentBuffer.length() == 0) {
break;
}
request += currentBuffer + "\r\n";
if (currentBuffer.startsWith("CONNECT ") || currentBuffer.startsWith("GET ")) {
host = this.parseHost( currentBuffer );
port = this.parsePort( currentBuffer );
}
}
request += "\r\n";
if (host.isEmpty() || request.isEmpty()) {
throw new InterruptedException("request or host empty, so exiting ");
}
clientRequestProcess clientProcess = new clientRequestProcess( host, port, request, this.threadNum );
byte[] response = clientProcess.processRequest();
this.serverOut.write(response);
this.serverOut.close();
}
}
所有代码都是草案,并简化为显示其工作原理的全貌。这里错过了所有try-catch块,调试信息等。
步骤 - 设置浏览器以使用JAVA代理 - 打开一些网站 - 部分http请求已成功处理,并返回正确的响应 - 部分请求显示为在firebug中中止。问题是该部分绝对是随机的,所以有一次加载某个文件,另一个文件不是
代码疑难解答显示我的第一行请求(来自浏览器)是空的,所以我的条件
public class clientRequestProcess {
public byte[] processRequest()
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte buf[] = new byte[256*1024];
Socket clientSocket = new Socket( host, port );
clientSocket.getOutputStream().write( request.getBytes() );
InputStream is = clientSocket.getInputStream();
int r = 1;
while (r > 0) {
r = is.read(buf);
if (r > 0) {
bos.write(buf, 0, r);
}
}
return bos.toByteArray();
}
}
中断读取套接字,因此它不会对浏览器造成任何影响,连接中止
我在http协议上阅读了rfc,并且发现https请求被认为已经过了一次\ r \ n符合,所以这就是我使用那个条件的原因 如果我只是在单独的选项卡中打开该文件 - 它会成功加载,不管我尝试重新加载它多少次。但是当一堆文件一次加载时 - 它们的一些随机内容会被中止。因此,只有在加载大量文件时才会发生这种情况,当一个或甚至3-5个 - 所有文件都加载正常
有什么想法吗? 感谢