HTTP服務器(2)

導語

重定向器是特殊用途的HTTP服務器的另外一個簡單而有用的應用程序。它的做用就是將用戶從一個WEB網站重定向到另一個網站。下面是一個簡單的例子,程序沿用上一個SingleHttpServer代碼。看起來很容易讀懂。html

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;

public class Redirector {
    private  static final Logger logger = Logger.getLogger("Redirector");
    private final int port;
    
    public Redirector(int _port) {
        try {
            Handler handler = new FileHandler("redirector.log");
            logger.addHandler(handler);
        } catch (SecurityException | IOException e) {
            throw new RuntimeException("沒法記錄日誌");
        }
        port = _port;
    }
    
    public void start() {
        try (ServerSocket server = new ServerSocket(port)) {
            logger.info("Redirecting connections on port " + server.getLocalPort() + "to www.xdysite.cn/index.html" );
            while (true) {
                try {
                    Socket socket = server.accept();
                    Thread t = new RedirectThread(socket);
                    t.start();
                } catch (IOException e) {
                    logger.warning("Exception accepting connection");
                } 
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        Redirector redirector = new Redirector(8080);
        redirector.start();
    }
}

class RedirectThread extends Thread{
    private final Socket socket;
    private static final String header;
    private static final String body;
    
    static {
        header = "HTTP/1.1 302 Found\r\n" 
                + "Server: Redirector 1.1\r\n" 
                + "Location: http://www.xdysite.cn/index.html\r\n" 
                + "Content-Type: text/html\r\n";
        body = "<html><head><title>文件已移到別處</title></head><body><bold>文件已移到別處</bold></body></html>";
    }
    
    
    public RedirectThread(Socket _socket) {
        socket = _socket;
    }
    
    

    @Override
    public void run() {
        try(
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        ) {
            String get = reader.readLine();
            if (get != null && get.indexOf("HTTP") != -1) {
                writer.write(header + "Date: " + new Date() + "\r\n\r\n");
                writer.write(body);
                writer.flush();
            }
        } catch (IOException e) {
            
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
相關文章
相關標籤/搜索