使用 Apple 服务器管理员在 Mac 服务器上运行 Java http 服务

使用 Apple 服务器管理员在 Mac 服务器上运行 Java http 服务

我编写了一个简单的 com.sun.net.httpserver.HttpServer 程序,该程序可在非服务器 Mac 上运行。当我http://localhost:39600/test在 Web 浏览器中访问时,它会给出正确的响应:“这是我的响应!”。

然后,我将这个 java 文件移动到使用 Server Admin 管理的 Web 服务器 Mac OS X Snow Leopard 上,编译它,在端口 39600 上运行它,http://localhost:39600/test在 Web 服务器的 Internet 浏览器中访问。它给出了正确的响应。但是当我访问时,http://webserveraddress:39600/test它根本没有响应。我知道这可能是服务器管理员和防火墙的问题,但是我如何通过 Server Admin 打开端口 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
    }
}

答案1

这很可能是由路由器上的端口关闭引起的,尽管也可能是 Web 服务器上的防火墙。您需要在路由器上为服务器网络打开端口 39600 - 这称为端口转发。

答案2

事实证明,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

相关内容