Firewall tunneling
Перевод на русский © , 2000
Java Q&A
Как мне соединиться с моим Java сервером через HTTP когда клиент находится за proxy/firewall? Я пробовал такое с апплетом, но он выдает в числе прочих исключение "host unreachable".
Вы не можете соединится, потому что proxy/firewall клиента предотвращает большинство соединений через сокеты. Большинство файрволов перекрывают любой обмен информацией, кроме HTTP. Это делается для того, чтобы защитить внутренюю инфраструктуру; пользователи по-прежнему могут использовать Веб, но не могут соединится с другими сетевыми приложениями.
Однако, есть способы для соединения ваших Java приложений и серверов через HTTP. Иногда такой прием называют firewall tunneling. Для того, чтобы облегчить себе жизнь, напишите сервлеты для сервера и оберните все клиентские сообщения в HTTP запросы.
На стороне клиента ваш код должен использовать URLConnection для отправки данных на сервер:
//соединится URL url = new URL("http://www.myserver.com/ servlets/myservlet");
URLConnection conn = url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestProperty("Content-Type", "application/octet-stream");
//Открываем output stream и посылаем данные. OutputStream out = conn.getOutputStream(); //В данном случае ничего не выдается в поток, но вы можете это сделать.
out.flush(); out.close();
//Открываем input stream и загружаем данные. InputStream in = conn.getInputStream();
//Здесь вы будете загружать свои данные.
in.close()
На стороне сервера, когда клиент выдает openConnection(), вызывается метод сервлета doPost(). В этом методе вы можете читать данные и отсылать их клиенту.