Я хочу открыть веб-сайт в веб-браузере. Я знаю, что это легко, но я хочу сделать это по-другому... Это похоже на прокси-сервер. Я сделал код Java, который будет получать контент (исходный код) веб-страницы и когда браузер запрашивает localhost по определенному номеру порта этого кода пишет исходный код в браузере. Но вместо того, чтобы получать веб-страницу, я получаю исходный код веб-страницы в браузере, а также я хочу сделать запрос из java-кода как иллюзию браузера. Сервер должен чувствовать, что этот запрос сделан из браузера, а не из java-консоли.
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String args[]) throws Exception{
URL ul = null;
HttpURLConnection ulc = null;
ServerSocket server = null;
Socket client = null;
DataInputStream in = null;
DataOutputStream out = null;
String c = null;
server = new ServerSocket(9898);
System.out.println("Server is waiting for clients on port no 9898....");
while(client == null){
client = server.accept();
}
System.out.println("Connected.....");
out = new DataOutputStream(client.getOutputStream());
ul = new URL("http://www.google.com");
ulc = (HttpURLConnection)ul.openConnection();
in = new DataInputStream(ulc.getInputStream());
while((c = in.readLine())!=null){
out.writeBytes(c);
}
in.close();
out.close();
client.close();
}
}
Загрузка веб-страниц не так проста, как вы, наверное, думаете. Оба браузера и сервера используют протокол HTTP. Проще говоря, браузер отправляет запрос, состоящий из строки запроса, заголовков, а иногда и данных, и сервер отвечает линией ответа, заголовками и данными. На большинстве веб-страниц также есть связанные ресурсы, которые необходимо загрузить для отображения страницы (например, изображения, таблицы стилей и сценариев), и каждый ресурс загружается через отдельный запрос.
Ваша программа принимает только один запрос, полностью игнорирует детали запроса, а затем загружает фиксированную веб-страницу и отправляет ее в качестве ответа. Как вы загружаете веб-страницу (с URL
), вы получаете только часть данных ответа (источник страницы); строка ответа и заголовки отсутствуют. Заголовки очень важны, поскольку один из них (называемый "Content-Type") указывает, какой именно ресурс - веб-страница, изображение или что-то еще. Без этого браузеры обычно предполагают, что данные являются простым текстом и отображают его соответствующим образом.
Поэтому, если вы хотите, чтобы ваш эксперимент работал лучше, вам нужно убедиться, что вы отправляете полный и действительный HTTP-ответ в браузер. Вероятно, вы можете восстановить линию ответа и заголовки из объекта HttpURLConnection
. Или вы можете напрямую использовать сокеты для загрузки веб-страницы.
Лучшим решением было бы использовать веб-сервер java (например, Jetty), в котором вы запустили сервлет, который загружает удаленную страницу с помощью клиентской библиотеки HTTP (например, Apache HttpComponents) и выполняет необходимую обработку адресов и заголовков. Но.. маленькие шаги :)