Недавно я учился создавать сокеты для подключения к веб-серверу. Мне удалось кое-что написать на Java:
BufferedReader inUser = new BufferedReader(new
InputStreamReader(System.in));
Socket clientSocket = new Socket("www.google.com", 80); // url expected
DataOutputStream outServer = new DataOutputStream
(clientSocket.getOutputStream());
BufferedReader inServer = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
String sentence = inUser.readLine();
outServer.writeBytes(sentence + '\n');
String modifiedSentence = inServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
inUser.close();
outServer.close();
inServer.close();
clientSocket.close();
Я также использую программу socketTest (из http://sockettest.sourceforge.net/) для проверки моих клиент. Соединение кажется нормальным, и я могу использовать самый сокет для получения и отправки сообщений (размещая локальный сервер). Когда я пытаюсь отправить строку на веб-сервер (в моем java-коде это называется «предложение»), он возвращает неверные запросы для случайного ввода, такие как «sd» или «a», как и ожидалось. Однако когда я набираю запрос, по которому хотел бы получить отзыв, я ничего не получаю. Конечно, это то, что я вставил (хранится в «предложении»):
GET index.html http/1.0
Либо я должен получить файл, если он существует, либо исключение, если что-то пошло не так, верно? Но я ничего не получаю. Еще более странно то, что я заметил, что в первый раз, когда я ввожу ввод, мне просто нужно убедиться, что у меня есть 3 отдельные случайные строки (разделенные пробелом), чтобы они были приняты как действительный ввод. И любой случайный ввод, который я введу позже, например 'sd', также будет принят.
Еще одно наблюдение, которое я сделал, заключается в том, что программа продолжает работать. Обычно я должен прочитать одну строку, после чего программа останавливается. Это означает, что он ничего не смог прочитать.
Я использую порт 80 для всех страниц, которые пробовал. Вот небольшой список веб-сайтов, на которых я пытался выполнить запрос: - www.google.com - en.wikipedia.org - www.cracked.com
Я пробовал настроить несколько других исключительно для учебных пособий. Почему я ничего не получаю? Когда я попробовал это с помощью telnet, некоторые из них, похоже, работали (хотя www.google.com всегда возвращал ошибку xxx).
1 ответ
Попробуйте написать дополнительный "\ r \ n" перед сбросом выходного потока:
BufferedReader inUser = new BufferedReader(new InputStreamReader(System.in));
URL url = new URL("http://www.google.com");
Socket clientSocket = new Socket(url.getHost(), 80); // url expected
OutputStream output = clientSocket.getOutputStream();
PrintWriter pw = new PrintWriter(output,false);
pw.print("GET index.html HTTP/1.0\r\n");
pw.print("\r\n");
pw.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String modifiedSentence = input.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].
new Socket(url.getHost(), 80)
должно бытьnew Socket(url.getHost(), url.getPort())
. И вам действительно следует использоватьURL.openStream()
илиURL.openConnection()
вместо прямого использованияSocket
. См. Это: Работа с URL-адресами