Недавно я учился создавать сокеты для подключения к веб-серверу. Мне удалось кое-что написать на 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
Babyburger 4 Мар 2014 в 03:21

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);
2
deanosaur 4 Мар 2014 в 05:00
1
Вместо new Socket(url.getHost(), 80) должно быть new Socket(url.getHost(), url.getPort()). И вам действительно следует использовать URL.openStream() или URL.openConnection() вместо прямого использования Socket. См. Это: Работа с URL-адресами
 – 
Remy Lebeau
4 Мар 2014 в 05:59
Большое спасибо! Добавление еще одного \ r \ n в конце моего сообщения имело решающее значение ..
 – 
Babyburger
4 Мар 2014 в 11:47
Спасибо за предложение; У меня действительно было что-то, что сработало, используя HttpUrlConnection, но я не уверен, разрешено ли мне его использовать, поскольку это задание для учебных целей. В нем упоминалось, что я должен использовать только библиотеку Java Socket. Я должен добавить, что url.getPort () дал мне исключение IllegalArgumentException: port out of range: -1.
 – 
Babyburger
4 Мар 2014 в 11:47