Firewall
帶有 Apple 伺服器管理員的 mac 伺服器上的 java http 服務
我編寫了一個在非伺服器 mac 上執行的簡單 com.sun.net.httpserver.HttpServer 程序。當我
http://localhost:39600/test
在網路瀏覽器中訪問時,它給了我正確的響應:“這是我的響應!”。然後我將這個 java 文件移動到由 Server Admin 管理的網路伺服器 Mac OS X Snow Leopard,編譯它,在埠 39600 上執行它,
http://localhost:39600/test
在網路伺服器的網際網路瀏覽器中訪問。它給出了正確的響應。但是當我訪問http://webserveraddress:39600/test
它時,它根本沒有反應。我知道這可能與伺服器管理員和防火牆有關,但是如何通過伺服器管理員向外部請求開放埠 39600?這是簡單的標準 java 類,但我認為這更多是伺服器管理的問題。
package server; import java.io.*; import java.net.*; import com.sun.net.httpserver.*; public class Server { private static final int SERVER_PORT_NUMBER = 39600; private static final int MAX_WAITING_CONNECTIONS = 10; public static void main(String[] args) { new Server().run(); } private Server(){ } private HttpServer server; private void run(){ configure(); server.createContext("/test", testHandler); server.start(); } private HttpHandler testHandler = new HttpHandler(){ @Override public void handle(HttpExchange t) throws IOException { //TODO read request body t.sendResponseHeaders(200, 0); //all ok! OutputStream os = t.getResponseBody(); os.write("Here's my response!".getBytes()); os.close(); } }; private void configure(){ try { server = HttpServer.create(new InetSocketAddress(SERVER_PORT_NUMBER), MAX_WAITING_CONNECTIONS); } catch (IOException e) { System.out.println("Could not create HTTP server: " + e.getMessage()); e.printStackTrace(); return; } server.setExecutor(null); // use the default executor } }
事實證明,Server Admin 不管理特定埠。Snow Leopard 防火牆的 GUI 只允許您打開特定的應用程序(以及它們相關的埠號)。要打開特定埠,您必須深入到終端並輸入00001 和 65535 之間的
sudo ipfw add <rulenumber> allow tcp from any to any dst-port <portnum>
位置,並且也是(有保留的埠號……你可以看到哪些是.<rulenumber>``<portnum>``sudo ipfw list
這很可能是由路由器上的關閉埠引起的,儘管它可能是 Web 伺服器上的防火牆。您需要在路由器上為伺服器網路打開埠 39600 - 這稱為埠轉發。