HTTP是个大协议,完整功能的HTTP服务器必须响应资源请求,将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST等)。处理不存在的文件请求,返回各种形式的状态码,解析MIME类型等。但许多特定功能的HTTP服务器并不需要所有这些功能。例如,很多网站只是想显示“建设中“的消息。很显然,Apache对于这样的网站是大材小用了。这样的网站完全可以使用只做一件事情的定制服务器。Java网络类库使得编写这样的单任务服务器轻而易举。
定制服务器不只是用于小网站。大流量的网站如Yahoo,也使用定制服务器,因为与一般用途的服务器相比,只做一件事情的服务器通常要快得多。针对某项任务来优化特殊用途的服务器很容易;其结果往往比需要响应很多种请求的一般用途服务器高效得多。例如,对于重复用于多页面或大流量页面中的图标和图片,用一个单独的服务器处理会更好(并且还可以避免在请求时携带不必要的Cookie,因而可以减少请求/响应数据,从而减少下载带宽,提升速度);这个服务器在启动时把所有图片文件读入内存,从RAM中直接提供这些文件,而不是每次请求都从磁盘上读取。此外,如果你不想在包含这些图片的页面请求之外单独记录这些图片,这个单独服务器则会避免在日志记录上浪费时间。
本篇为大家简要演示三种HTTP服务器:
(1) 简单的单文件服务器
(2) 重定向服务器
(3) 完整功能的HTTP服务器
简单的单文件服务器
该服务器的功能:无论接受到何种请求,都始终发送同一个文件。这个服务器命名为SingleFileHTTPServer,文件名、本地端口和内容编码方式从命令行读取。如果缺省端口,则假定端口号为80。如果缺省编码方式,则假定为ASCII。
- import java.io.*;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class SingleFileHTTPServer extends Thread {
- private byte[] content;
- private byte[] header;
- private int port=80;
- private SingleFileHTTPServer(String data, String encoding,
- String MIMEType, int port) throws UnsupportedEncodingException {
- this(data.getBytes(encoding), encoding, MIMEType, port);
- }
- public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException {
- this.content=data;
- this.port=port;
- String header="HTTP/1.0 200 OK\r\n"+
- "Server: OneFile 1.0\r\n"+
- "Content-length: "+this.content.length+"\r\n"+
- "Content-type: "+MIMEType+"\r\n\r\n";
- this.header=header.getBytes("ASCII");
- }
- public void run() {
- try {
- ServerSocket server=new ServerSocket(this.port);
- System.out.println("Accepting connections on port "+server.getLocalPort());
- System.out.println("Data to be sent:"