Toma4.1实现HTTP/1.1持久化处理(以行读取字节流)
来源:互联网 发布:苹果网络授权经销商 编辑:程序博客网 时间:2024/06/04 18:52
1.浏览器在发送数据的时候,如果是get方式,直接发送,如果是 post方式会发送content-length表明发送数据的大小
2.浏览器在接收数据的时候一般都会知道要接收数据的大小,这样浏览器不至于盲目等待和阻塞
3.服务器在读取请求的时候是以一行来读取.那么它是怎么知道读取完所有有头的呢?原因就在头后面的一个\r\n,如果读取这个就表明头结束,不再下读取,这样就不会造成
服务器读取的时候阻塞
2.浏览器在接收数据的时候一般都会知道要接收数据的大小,这样浏览器不至于盲目等待和阻塞
3.服务器在读取请求的时候是以一行来读取.那么它是怎么知道读取完所有有头的呢?原因就在头后面的一个\r\n,如果读取这个就表明头结束,不再下读取,这样就不会造成
服务器读取的时候阻塞
4.而服务器发送数据的时候,会将数据大小发送过去,如果是静态html页面的话,就直接 content-length标明,如果是动态的话,以chunked发送,每次write前,将大小write
在解析请求头信息时,tomcat 提供了一个SocketInputStream 来读取socket 中 inputStream 中的信息,将其读取出来
然后进行解析,由于 http请求头格式如果下
XXXX: XXX\r\n
XXXX: XXX\r\n
\r\n
所以,socketInputStream 每次就读取直到 \r\n,然后再次读取,就是形如:
for(;;){
if(buffer[pos] == (byte)'\r')
continue;
} if(buffer[pos]==(byte)'\n')
break;
在读取socket 流时,由于不知道什么时候读取停止,会造成 read() 阻塞,所以,读取时一定要提交明确的停止界限
而 socketInputStream 则是根据最后的 \r\n 来标识的,在 读取前,如果则上来就讲到一个\r\n,则表明读取完毕
下面是一个模仿socketInputStream 流的例子,也是以行来读取字节,遇到 \r\n来结束
package stream;import java.io.EOFException;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/** * 以行读取字节 * * * */public class LineInputStream { private static final byte CR = (byte) '\r'; private static final byte LF = (byte) '\n'; private static final int SIZE = 1024; private byte[] buf; private int pos; private int count; private InputStream in; public LineInputStream(InputStream in, int size) {this.in = in;buf = new byte[size]; } public LineInputStream(InputStream in) {this(in, SIZE); } public int read() throws IOException {if (pos >= count) { fill(); if (pos >= count)return -1;}return buf[pos++] & 0xff; } /** * 一次读取一行,以\r\n为结束标记,读取结束返回 null 读取结束与 EOF 不同,读取结束以 \r\n正学结束,停止外部的循环读取 * 而EOF不是以 \r\n为结束,而是在\r\n之前流 * * @return * @throws IOException */ public String readLine() throws IOException {StringBuilder sb = new StringBuilder();int ch = read();if (ch == -1) throw new EOFException(); // 表明流结束,如果是socket,则表明socket.close()if (ch == CR || ch == LF) { // 如果刚开始就讲到了\r\n,表明必送结束 read(); return null;}pos--;while (true) { if (pos >= count) {fill();if (pos >= count) return sb.toString(); } if (buf[pos] == CR) {pos++;continue; } if (buf[pos] == LF) {pos++;break; } sb.append((char) (buf[pos++] & 0xff));}return sb.toString(); } public int readLine(byte[] buffer, int offset, int len) throws IOException {// 进行参数化检查if (buffer == null) throw new NullPointerException();if (offset < 0 || offset > buffer.length || len < 0|| offset + len > buffer.length) throw new ArrayIndexOutOfBoundsException();int allBits = 0;int ch = read();if (ch == -1) return -1; if (ch == CR || ch == LF) return -1;pos--;while(true) { if(pos>=count) {fill();if(pos>=count) return allBits; } if(buf[pos]==CR) {pos++;continue; } if(buf[pos]==LF || allBits==len) {pos++;break; } buffer[allBits++] = buf[pos++]; }return allBits; } /* * 在 pos>=count时,也就是buf数据读完时才fill */ private void fill() throws IOException {pos = 0;count = 0;int len = in.read(buf);if (len > 0) // 否则流就关闭了 count = len; } public static void main(String args[]) throws Exception {LineInputStream lin = new LineInputStream(new FileInputStream("F:\\c.txt"), 4);/*String line = null;while ((line = lin.readLine()) != null) { System.out.println(line);}*/byte[] buffer = new byte[100];int len = -1;while((len=lin.readLine(buffer, 0, buffer.length))!=-1) { System.out.println(new String(buffer,0,len));} }}
- Toma4.1实现HTTP/1.1持久化处理(以行读取字节流)
- 自定义包装流,以行读取字节
- 以字节流的形式读取文件
- Java字节流数据逐行读取(readLine),处理以Tab分隔符划分的数据
- java 实现以字节为单位读取文件(2)
- 以字节流读取文件时中文乱码解决
- VSTO实现读取WORD字节流
- 持久化数据结构实现(数据结构保存,以备后用)
- Session数据的持久化读取实现原理
- 分别以字节、字符、行、随机四种方式读取文件(Java文件操作)
- java缓冲字节流的复制数据,数据以数组读取、写入,效率更高
- 以字节流读取文件时中文乱码解决(二)
- 字节流读取文件
- 文件读取字节流
- 名称以无效字符开头。处理资源 'http://localhost/' 时出错。第 1 行,位置: 2
- 名称以无效字符开头。处理资源 'http://localhost/' 时出错。第 1 行,位置: 2
- 文件的读取(持久化)
- java读取文件以字节流的形式读取 然后转化为字节流数组,最后经过SHA1加密生成返回16进制字符串存入数据库
- git extensions远程配置
- 最全的Android源码目录结构详解
- 在线计算子网的地址
- CentOS 安装MySQL全过程
- 我的秘密是爱你
- Toma4.1实现HTTP/1.1持久化处理(以行读取字节流)
- Qt下的OpenGL 编程(5)光照和纹理滤波
- BW的Repair Full Request
- 奥运tweet达1.5亿条:飞人博尔特1分钟激发8万条tweet!
- MFC DLL资源动态切换
- Google Chrome 22.0.1229.2(简体中文版)
- 你看我时我也在看你
- Hibernate 一对一共享主键关联的例子
- C++:在遍历/循环中删除map元素, 如何避免iter 迭代器失效