Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Сервер не отвечает повторно, если не создать сокет


Автор: i_SweP 25.10.2010, 21:31
В общем, следующий код рабочий. Но почему он не будет работать, если не пересоздавать сокет: в таком случае в InputStream ничего не приходит (свойство eof == true). Получается, что сервер не отвечает на второй, третий и следующие запросы с одного сокета?  smile 

Код

    String s = String.format("POST http://%s/%s%s\nHost: %s\n\n", host, SITE_REQ, req, host );

    System.out.println( "Sending request: \n" + s + "----------" );

    socket = new Socket( host, 80 );    // вот без этой строки
    OutputStream os = socket.getOutputStream();
    os.write( s.getBytes() );
    InputStream is = socket.getInputStream();


Автор: AntonSaburov 26.10.2010, 12:49
Так может сервер имеет хидер закрываться после того, как отдаст все данные. Посмотри Keep-alive.

Автор: i_SweP 26.10.2010, 20:05
Я не знаю как посмотреть header. Мне нужно лишь стянуть страницу, поэтому ещё сильно не разбирался.
На мой запрос он выдаёт само содержимое страницы. А как параметр Connection в ответе посмотреть (да и другие тоже), скажите plz ?

Автор: Skipy 27.10.2010, 12:32
Цитата(i_SweP @ 26.10.2010,  20:05)
На мой запрос он выдаёт само содержимое страницы. А как параметр Connection в ответе посмотреть (да и другие тоже), скажите plz ?

Кроме содержимого страницы у Вас должны быть еще и заголовки, ибо Вы вручную читаете ответ. Покажите всё, что приходит до пустой строки (после нее идет содержимое страницы).

Автор: COVD 27.10.2010, 15:49
http://download.oracle.com/javase/tutorial/networking/urls/readingWriting.html

Автор: i_SweP 27.10.2010, 19:36
Skipy
Я подумал, может сайт такой, но с твоего тоже самое, т.е. для 
POST http://www.skipy.ru/
Host: www.skipy.ru
С самой первой строки: <?xml version="1.0" encoding="UTF-8"?> и т.д....

COVD
Спасибо за ссылку, тоже думал, что-то такое должно быть

Автор: Skipy 28.10.2010, 10:02
Цитата(i_SweP @ 27.10.2010,  19:36)
Skipy
Я подумал, может сайт такой, но с твоего тоже самое, т.е. для 
POST http://www.skipy.ru/
Host: www.skipy.ru
С самой первой строки: <?xml version="1.0" encoding="UTF-8"?> и т.д....

Скажите, в Вы так, случайно, не пробовали посылать запрос, соответствующий протоколу HTTP

http://www.ietf.org/rfc/rfc2616.txt

Section 5.1

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

Код
Socket s = new Socket("www.skipy.ru", 80);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream(), "iso-8859-1"));
bw.write("GET / HTTP/1.1\r\n");
bw.write("Host: www.skipy.ru\r\n");
bw.write("\r\n");
bw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8"));
while (true){
    String line = br.readLine();
    if (line == null){
        break;
    }
    System.out.println(line);
}
s.close();


И ответ: 

Код
HTTP/1.1 200 OK
Date: Thu, 28 Oct 2010 07:01:12 GMT
Server: Apache/2.0.63-lk.d (Unix) mod_ssl/2.0.63-lk.d OpenSSL/0.9.8g mod_dp20/0.99.2 mod_python/3.3.1 Python/2.5.1 mod_ruby/1.2.6 Ruby/1.8.6(2007-09-24)
Last-Modified: Fri, 15 Oct 2010 12:30:35 GMT
ETag: "a0ec4d-3356-fe44f0c0"
Accept-Ranges: bytes
Content-Length: 13142
Connection: close
Content-Type: text/html; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html ...


Добавлено через 10 минут и 47 секунд
Цитата(i_SweP @ 25.10.2010,  21:31)
Получается, что сервер не отвечает на второй, третий и следующие запросы с одного сокета?

Задача сервера - обслуживать запросы. Много. А для этого надо максимально быстро освобождать ресурсы. Потому - сервер не может себе позволить такой роскоши как держать открытым сокет, в надежде, что Вы у него еще что-то спросите. Он это может делать только если его специально попросить указанием заголовка Connection: Keep-Alive. Причем именно "может", а не "обязан".

Автор: i_SweP 28.10.2010, 19:23
Цитата(Skipy @  28.10.2010,  10:02 Найти цитируемый пост)
Скажите, в Вы так, случайно, не пробовали посылать запрос, соответствующий протоколу HTTP? 

И случайно, и не очень пробовал. От чего и удивился, где заголовок в ответе. Но сейчас стало ясно, спасибо за маленький ликбез smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)