重定向器是特殊用途的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(); } } } }