现在的位置: 首页 > 综合 > 正文

用Java编写你自己的简单HTTP服务器

2013年04月09日 ⁄ 综合 ⁄ 共 1886字 ⁄ 字号 评论关闭

HTTP是个大协议,完整功能的HTTP服务器必须响应资源请求,将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST等)。处理不存在的文件请求,返回各种形式的状态码,解析MIME类型等。但许多特定功能的HTTP服务器并不需要所有这些功能。例如,很多网站只是想显示“建设中“的消息。很显然,Apache对于这样的网站是大材小用了。这样的网站完全可以使用只做一件事情的定制服务器。Java网络类库使得编写这样的单任务服务器轻而易举。

 

定制服务器不只是用于小网站。大流量的网站如Yahoo,也使用定制服务器,因为与一般用途的服务器相比,只做一件事情的服务器通常要快得多。针对某项任务来优化特殊用途的服务器很容易;其结果往往比需要响应很多种请求的一般用途服务器高效得多。例如,对于重复用于多页面或大流量页面中的图标和图片,用一个单独的服务器处理会更好(并且还可以避免在请求时携带不必要的Cookie,因而可以减少请求/响应数据,从而减少下载带宽,提升速度);这个服务器在启动时把所有图片文件读入内存,从RAM中直接提供这些文件,而不是每次请求都从磁盘上读取。此外,如果你不想在包含这些图片的页面请求之外单独记录这些图片,这个单独服务器则会避免在日志记录上浪费时间。

 

本篇为大家简要演示三种HTTP服务器:

(1)     简单的单文件服务器

(2)     重定向服务器

(3)     完整功能的HTTP服务器

简单的单文件服务器

该服务器的功能:无论接受到何种请求,都始终发送同一个文件。这个服务器命名为SingleFileHTTPServer,文件名、本地端口和内容编码方式从命令行读取。如果缺省端口,则假定端口号为80。如果缺省编码方式,则假定为ASCII。

  1. import java.io.*;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4.   
  5.   
  6. public class SingleFileHTTPServer extends Thread {  
  7.       
  8.     private byte[] content;  
  9.     private byte[] header;  
  10.     private int port=80;  
  11.       
  12.     private SingleFileHTTPServer(String data, String encoding,  
  13.                 String MIMEType, int port) throws UnsupportedEncodingException {  
  14.         this(data.getBytes(encoding), encoding, MIMEType, port);  
  15.     }  
  16.       
  17.     public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException {  
  18.         this.content=data;  
  19.         this.port=port;  
  20.         String header="HTTP/1.0 200 OK\r\n"+  
  21.             "Server: OneFile 1.0\r\n"+  
  22.             "Content-length: "+this.content.length+"\r\n"+  
  23.             "Content-type: "+MIMEType+"\r\n\r\n";  
  24.         this.header=header.getBytes("ASCII");  
  25.     }  
  26.       
  27.     public void run() {  
  28.         try {  
  29.             ServerSocket server=new ServerSocket(this.port);  
  30.             System.out.println("Accepting connections on port "+server.getLocalPort());  
  31.             System.out.println("Data to be sent:"

抱歉!评论已关闭.