Java代理服务器 - 一些请​​求中止,怪异的bug

时间:2012-11-03 19:47:10

标签: java http sockets proxy

我是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个 - 所有文件都加载正常

有什么想法吗? 感谢

0 个答案:

没有答案