標籤:
該伺服器的功能:無論接受到何種請求,都始終發送同一個檔案。這個伺服器命名為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:");
- System.out.write(this.content);
-
- while (true) {
- Socket connection=null;
- try {
- connection=server.accept();
- OutputStream out=new BufferedOutputStream(connection.getOutputStream());
- InputStream in=new BufferedInputStream(connection.getInputStream());
-
- StringBuffer request=new StringBuffer();
- while (true) {
- int c=in.read();
- if (c==‘\r‘||c==‘\n‘||c==-1) {
- break;
- }
- request.append((char)c);
-
- }
-
- //如果檢測到是HTTP/1.0及以後的協議,按照規範,需要發送一個MIME首部
- if (request.toString().indexOf("HTTP/")!=-1) {
- out.write(this.header);
- }
-
- out.write(this.content);
- out.flush();
-
- } catch (IOException e) {
- // TODO: handle exception
- }finally{
- if (connection!=null) {
- connection.close();
- }
- }
- }
-
- } catch (IOException e) {
- System.err.println("Could not start server. Port Occupied");
- }
- }
-
- public static void main(String[] args) {
- try {
- String contentType="text/plain";
- if (args[0].endsWith(".html")||args[0].endsWith(".htm")) {
- contentType="text/html";
- }
-
- InputStream in=new FileInputStream(args[0]);
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- int b;
- while ((b=in.read())!=-1) {
- out.write(b);
- }
- byte[] data=out.toByteArray();
-
- //設定監聽連接埠
- int port;
- try {
- port=Integer.parseInt(args[1]);
- if (port<1||port>65535) {
- port=80;
- }
- } catch (Exception e) {
- port=80;
- }
-
- String encoding="ASCII";
- if (args.length>2) {
- encoding=args[2];
- }
-
- Thread t=new SingleFileHTTPServer(data, encoding, contentType, port);
- t.start();
-
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("Usage:java SingleFileHTTPServer filename port encoding");
- }catch (Exception e) {
- System.err.println(e);// TODO: handle exception
- }
- }
- }
SingleFileHTTPServer類本身是Thread的子類。它的run()方法處理入站串連。此伺服器可能只是提供小檔案,而且只支援 低輸送量的web網站。由於伺服器對每個串連所需完成的所有工作就是檢查用戶端是否支援HTTP/1.0,並為串連產生一兩個較小的位元組數組,因此這可能 已經足夠了。另一方面,如果你發現用戶端被拒絕,則可以使用多線程。許多事情取決於所提供檔案的大小,每分鐘所期望串連的峰值數和主機上Java的線程模 型。對弈這個程式複雜寫的伺服器,使用多線程將會有明顯的收益。
Run()方法在指定連接埠建立一個ServerSocket。然後它進入無限迴圈,不斷地接受串連並處理串連。當接受一個socket時,就會由一 個InputStream從用戶端讀取請求。它查看第一行是否包含字串HTTP。如果包含此字串,伺服器就假定用戶端理解HTTP/1.0或以後的版 本,因此為該檔案發送一個MIME首部;然後發送資料。如果用戶端請求不包含字串HTTP,伺服器就忽略首部,直接發送資料。最後伺服器關閉串連,嘗試 接受下一個串連。
而main()方法只是從命令列讀取參數。從第一個命令列參數讀取要提供的檔案名稱。如果沒有指定檔案或者檔案無法開啟,就顯示一條錯誤資訊,程式退 出。如果檔案能夠讀取,其內容就讀入byte數組data.關於檔案的內容類型,將進行合理的猜測,結果儲存在contentType變數中。接下來,從 第二個命令列參數讀取連接埠號碼。如果沒有指定連接埠或第二個參數不是0到65535之間的整數,就使用連接埠80。從第三個命令列參數讀取編碼方式(前提是提供 了)。否則,編碼方式就假定為ASCII。然後使用這些值構造一個SingleFileHTTPServer對象,開始運行。這是唯一可能的介面。
java簡單的單檔案伺服器