1 缓冲流的readLine方法是否阻塞?
是
2 请求(获取),响应(返回),分别的格式什么?HTTP的规则是什么?
http请求格式
一次请求,一次响应,没有请求,没有响应。
3 HTTP协议是什么?
超文本传输协议,是浏览器与服务器间的传输通讯协议。
4 HTTP请求由什么组成?
请求行,消息头,消息正文。
5 请求行格式是什么?
Method Request-URI HTTP-VersionCRLF
(CR:指代不同系统中的回车 LF:指代不同系统中的换行——CRLF:换行到最开始,即该行结束)
如:
GET /index.html HTTP/1.1CRLF
POST /login.html HTTP/1.1CRLF
6 什么是DNS?
将域名绑定在指定IP地址,访问时域名转换成对应IP地址。
7 CRLF的作用是?
表示当行结束。
8 服务器可否使用br(BufferedReader)按行快速读取请求头(CRLF换行)?如果不能用什么?具体读取流程是?
不可,br换行只看\n(不会智能识别不同系统下的换行)
使用StringBuilder一个字符一个字符读取,直到读取到CR(13),LF(10)为止。
具体读取流程:判断当次及上次的数字是否等于10和13,如果是就跳出,如果不是,就将当次的值转型成char后加入builder并将当次的值赋给c2,用以下次判断
且由于最后字符多出CRLF,必须用String.trim()去掉这两个空白字符。
int c1 = -1,c2 = -1
while((c1 = in.read())! = -1){
if(c1 == 10 && c2 == 13){
break;
}
bulider.append((char)c1);
c2 = c1;
}
String line = builder.toString().trim();
9 HTTP请求默认访问什么端口?
80
10 请求头中包含的URI将会请求服务器中的网页。
11 第一次获取请求头时while(true)中需要包含is吗?
不需要,is获取的是一大段,循环基准是换行而不是重新获取数据。
12 当需要同时处理多个用户发送过来的请求时,用while(true)还是线程?
线程,因为需要同时,而不是处理完一个再处理另一个。
13 为何需要用到线程池?
提高并发效率。
14 是否需要将读取请求行等分开?
是。
15 读取HTTP请求的流程是?
读取请求行
读若干行(直到读取了CRLF)。
读取消息正文
分析请求行请求什么资源
16 业务逻辑要极其清晰,一个方法实现一个功能。
服务器整体业务流程,
新建一个服务器获取请求,读取处理请求,返回请求资源
将后两个流程中包入ClietnHandler(新建类),一旦有新的请求便创建新的线程,由于线程较多,因此需要用线程池管理。
ClientHandler中的主要流程又是run方法,run方法(便是包含获取,读取,处理请求)的流程为,
①读取请求,将请求项转化为对象,方便后续检索确定返回的数据。
对象包括请求头及消息头查找表,将处理该对象的方法也写入。
消息头查找表在使用前必须实例化,不然用不了
跳出循环的判断条件是 返回字符串长度为0 而不是全等于null或""。(StringBuilder内部默认维护一个空字符串)
②返回请求,将响应的属性实例化成一个对象。
请求对象包含:
其中状态值必须用字典存放
由大至小,不管是在大流程的把握上,还是完善小的分支都要胸有成竹。要一直把控握着whole map。
17 思路打好后,要先做什么?
打桩。
18 InputStream的read()方法返回的是什么?
下一个字节,直到读取完毕返回-1。