Я написал простую программу 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 на маршрутизаторе для сети сервера - это называется переадресацией портов.