HTTP-сервис Java на Mac сервере с администратором сервера Apple
Я написал простую программу com.sun.net.httpserver.HttpServer, которая работает на несерверном Mac. Когда я посещаю http://localhost:39600/test
в веб-браузере он дает мне правильный ответ: "Вот мой ответ!".
Затем я перемещаю этот Java-файл на веб-сервер Mac OS X Snow Leopard, управляемый с помощью Admin Server, компилирую его, запускаю на порту 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
}
}
2 ответа
Оказывается, что Admin Сервера не управляет определенными портами. Графический интерфейс для межсетевого экрана Snow Leopard позволяет открывать только определенные приложения (и, следовательно, связанные с ними номера портов). Чтобы открыть определенный порт, вы должны зайти в терминал и набрать sudo ipfw add <rulenumber> allow tcp from any to any dst-port <portnum>
где <rulenumber>
находится между 00001 и 65535 и <portnum>
также (есть зарезервированные номера портов... вы можете увидеть, какие из них с sudo ipfw list
,
Скорее всего, это вызвано закрытым портом на маршрутизаторе, хотя это может быть брандмауэр на веб-сервере. Вам необходимо открыть порт 39600 на маршрутизаторе для сети сервера - это называется переадресацией портов.