Назад | Перейти на главную страницу

служба java http на сервере Mac с администратором сервера Apple

Я написал простую программу com.sun.net.httpserver.HttpServer, которая работает на Mac без сервера. Когда я приезжаю http://localhost:39600/test в веб-браузере он дает мне правильный ответ: «Вот мой ответ!».

Затем я перемещаю этот java-файл на веб-сервер Mac OS X Snow Leopard, управляемый с помощью Server Admin, компилирую его, запускаю на порту 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 позволяет открывать только определенные приложения (и, следовательно, связанные с ними номера портов). Чтобы открыть определенный порт, вам нужно зайти в Терминал и ввести sudo ipfw add <rulenumber> allow tcp from any to any dst-port <portnum> где <rulenumber> находится между 00001 и 65535 и <portnum> тоже (есть зарезервированные номера портов ... вы можете увидеть, какие из них sudo ipfw list.

Скорее всего, это вызвано закрытым портом на маршрутизаторе, хотя это может быть брандмауэр на веб-сервере. Вам необходимо открыть порт 39600 на маршрутизаторе для сети сервера - это называется переадресацией портов.