如何使读取客户端请求模块非常高效(HTTP)?

时间:2013-05-02 09:59:02

标签: java algorithm http webserver buffer

我正在构建我的 HTTP WEB SERVER 。在这个项目中,我创建了一个读取客户端请求的模块,但效率非常低。所以请提出一些建议,我该如何使这个模块非常高效。我正在共享执行阅读请求任务的代码。见下文,

等待你的建议。提前谢谢。

我的部分代码

final static int BUF_SIZE = 2048;
byte[] buf = new byte[BUF_SIZE];
private Socket s;
InputStream is = new BufferedInputStream(s.getInputStream());
int nread = 0, r = 0;

    outerloop:
    while (nread < BUF_SIZE) {
        r = is.read(buf, nread, BUF_SIZE - nread);
        if (r == -1) {
            /* EOF */
            return;
        }
        int i = nread;
        nread += r;
        for (; i < nread; i++) {
            if (buf[i] == (byte) '\n' || buf[i] == (byte) '\r') {
                /* read one line */
                break outerloop;
            }
        }
    }

编辑没有。 1

以下是来自客户的请求,该请求存储在is

GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

以特殊字符\ r或\ n。

结束

如何使用任何优化方法将其置于缓冲区中。

2 个答案:

答案 0 :(得分:0)

如果你想加快一切,我会考虑从java.io切换到java.nio

更多信息: http://en.wikipedia.org/wiki/New_I/O  或者只是google it;)

答案 1 :(得分:0)

如果您正在阅读行,请使用BufferedReader.readLine()。目前你正在处理每个角色两次。但我认为没有理由认为这里存在任何重大的低效率,因为整个过程将受到网络限制。