/* 创建FileChannel对象*/
public void prepare() throws IOException {
if (fileChannel == null)
fileChannel = new RandomAccessFile(file, "r").getChannel();
length = fileChannel.size();
position = 0;
}
/* 发送正文,如果发送完毕,就返回false,否则返回true */
public boolean send(ChannelIO channelIO) throws IOException {
if (fileChannel == null)
throw new IllegalStateException();
if (position < 0)
throw new IllegalStateException();
if (position >= length) {
return false; //如果发送完毕,就返回false
}
position += channelIO.transferTo(fileChannel, position, length - position);
return (position < length);
}
public void release() throws IOException {
if (fileChannel != null){
fileChannel.close(); //关闭fileChannel
fileChannel = null;
}
}
}
9.运行HTTP服务器
运行命令“java HttpServer”,就启动了HTTP服务器。在HttpServer类的classpath下,有一个root目录,在该目录下存放了各种供浏览器访问的文档,比如login.htm、hello.htm和data.rar文件等。打开IE浏览器,输入URL:http://localhost/login.htm或者http://localhost/data.rar,就能接收到服务器发送过来的相应文档。如果浏览器按照POST方式访问hello.htm,服务器会返回HTTP405错误,因为本服务器不支持POST方式。
HTTP协议是目前使用非常广泛的应用层协议,它规定了在网络上传输文档(主要是HTML格式的网页)的规则。HTTP协议的客户程序主要是浏览器。浏览器访问一个远程HTTP服务器上的网页的步骤如下:
(1)建立与远程服务器的连结。
(2)发送HTTP请求。
(3)接收HTTP响应,断开与远程服务器的连结。
(4)展示HTTP响应中的网页内容。
HTTP服务器必须接收HTTP请求,对它进行解析,然后返回相应的HTTP响应结果。本文创建了一个非阻塞的HTTP服务器,它首先读取HTTP请求,把它们存放在字节缓冲区内,当缓冲区的容量不够时,要扩充它的容量,以保证容纳HTTP请求的所有数据。接着,程序把字节缓冲区内的字节转换为字符串,对其进行解析,获得HTTP请求中的请求方式、URI和协议版本等信息,然后创建相应的HTTP响应,把它发送给客户程序。
|