1

我对 Java 语言有点陌生,但在其他技术方面有很好的经验。

现在我正在创建一个代理服务器,并且我提出了似乎对单个请求工作正常的代码,但是当我试图打开一些html加载大量等的页面时stylesimages部分请求刚刚中止(这是萤火虫告诉我的)

因此,将尝试简化代码并尽可能具体地显示确切的问题

这是主要课程:

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++ ));
        }
    }
}

这是处理每个请求的 RequestProcess 的代码

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();    
    }
}

这是处理请求并将其发送到实际服务器的类

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();
    }   
}

所有代码都是草稿,并经过简化以显示其工作原理的大图。所有的 try-catch 块、调试信息等都在这里丢失。

步骤 - 设置浏览器以使用 JAVA 代理 - 打开一些站点 - 部分 http 请求已成功处理并返回正确的响应 -部分请求在 firebug 中显示为中止。问题是那部分是绝对随机的,所以一次加载某个文件,另一次加载

代码故障排除显示第一行请求(来自浏览器)是空的,所以我的情况

 if (currentBuffer.length() == 0) {
      break;
 }

中断读取套接字,因此它对浏览器没有任何反应,连接被中止

我阅读了关于 http 协议的 rfc 并发现 https 请求一旦遇到 \r\n 就被认为结束了,所以这就是我使用该条件的原因如果我只是在单独的选项卡中打开该文件 - 它加载成功,没关系我试图重新加载它多少次。但是,当一次加载一堆文件时 - 其中一些随机文件被中止。因此,只有在加载大量文件时才会发生这种情况,当一个甚至 3-5 个文件加载正常时

有任何想法吗?谢谢

4

0 回答 0