2008-09-26 11 views
7

Piszę serwer WWW w Javie i chcę go obsługiwać połączenia HTTP 1.1 Keep-Alive. Ale jak rozpoznać, kiedy klient wysyła żądania dotyczące danego połączenia? (jak podwójny koniec linii lub coś takiego).Skąd mam wiedzieć, KIEDY zamknąć połączenie utrzymywania połączenia HTTP 1.1?

Zobaczmy, jak stackoverflow obsługuje to bardzo niejasne pytanie - odpowiedzi, na które w Google są pogrążone w specyfikacjach technicznych i niejasny język. Chcę uzyskać prostą angielską odpowiedź dla programisty spoza C :)


Rozumiem. to potwierdza moje podejrzenie, że muszę polegać na wyjątku SocketTimeoutException. Ale nie byłem pewien, czy jest coś, na czym mógłbym polegać od klienta, który wskazuje, że odbywa się to za pomocą połączenia - co pozwoliłoby mi w większości przypadków zamknąć połączenia wcześniej - zamiast czekać na przekroczenie limitu czasu. Dzięki

Odpowiedz

8

Jeśli budujesz swój serwer zgodnie ze standardem, masz wiele informacji, które poprowadzą Cię tutaj.

Proste mówienie, powinno być oparte na czasie od użycia połączenia, a nie na poziomie danych żądania.

w dłuższej gadatliwy sposób practical considerations section z HTTP/1.1 dokument zawiera pewne wskazówki dla Ciebie:

„Serwery zwykle mają jakieś wartość limitu czasu, po przekroczeniu której będą one nie utrzymywać nieaktywne połączenie . Serwer proxy może spowodować, że będzie to wyższa wartość, ponieważ prawdopodobnie będzie ona nawiązywać więcej połączeń za pośrednictwem tego samego serwera. Użycie połączeń trwałych nie wymaga żadnych wymagań na długości (lub istnienia) tego czasu dla klienta lub serwera. "

lub

„Gdy klient lub serwer pragnie time-out powinien on wydać wdzięku Close na połączenie. Klienci i serwery POWINIEN stale obserwować drugą stronę , zamykając transport i odpowiadając na nią, odpowiednio, . Jeśli klient lub serwer nie wykrywa drugiej strony blisko szybko mogłoby to spowodować niepotrzebne drenażu zasobów w sieci „

+0

Dziękuję. Czytam to także ... Komentarze tutaj potwierdzają moje podejrzenia i teraz wiem, że nie idę ślepym zaułkiem. Łał. Stackoverflow działa! Dzięki – Bret

1

Zamykasz go, kiedy tylko chcesz. Nagłówek wskazuje, że klient wolałby pozostawić połączenie otwarte, ale nie wymaga to zgodności z serwerem. Większość serwerów pozostawia je otwarte na około 5-10 sekund, niektóre nie zwracają na to uwagi.

1

Powinieneś przeczytać dokument RFC dotyczący funkcji Keep-Alive. W przeciwnym razie możesz otrzymać serwer, który nie działa zgodnie z oczekiwaniami.

Jak już zaznaczył @ [Stephen], serwer może zamknąć połączenie w dowolnym momencie (ok, nie w środku pary żądania/odpowiedzi). Tak samo dla klienta. Każde inne rozwiązanie umożliwi serwerowi lub klientowi wykonanie DoS na drugiej stronie.

EDYCJA: Obejrzyj nagłówek połączenia. Klient (i serwer) może zażądać pełnego zamknięcia połączenia za pomocą nagłówka. Na przykład: Connection: close w żądaniu jest żądanie do serwera, aby zamknąć połączenie po wysłaniu odpowiedzi.

+0

Powodem, dla którego pytam, jest to, że większość przeglądarek internetowych (szczególnie tych, z którymi testowałem) nadal wysyła nagłówek "Połączenie: keep-alive" nawet po tym, jak wszystkie pliki .css/.js/etc zostały wymagane i otrzymane. Myślałem, że mogą być bardziej inteligentni niż ja i coś mi umknęło. – Bret

+0

Przeglądarki wolą pozostawić połączenie otwarte, ponieważ wydłuża to czas odpowiedzi, jeśli muszą wysyłać więcej żądań na te same serwery. Nic nie stoi na przeszkodzie, aby serwer ignorował funkcję Keep-Alive i zamykał połączenie po każdym żądaniu. – Alexander

3

Pozwala zobaczyć, jak stackoverflow obsługuje to bardzo niejasne pytanie. - odpowiedzi na które, w Google, są pogrążone w specyfikacjach technicznych i języka niejasne.

ja po prostu umieścić When should I close an HTTP 1.1 connection? w Google, a trzecie trafienie było HTTP Wykonane bardzo proste. w spisie treści, tam jest link do sekcji zatytułowanej Persistent Connections and the "Connection: close" Header . To Sekcja ma trzy akapity, używa bardzo prostego języka i mówi dokładnie, co chcesz wiedzieć.

chcę zwykły angielski Odpowiedź na non-programista C :)

Z całym szacunkiem, programowanie jest przedsięwzięciem technicznym, gdzie dane znaczenia, bardzo dużo. Czytanie dokumentacji technicznej jest absolutnie niezbędną umiejętnością. Poleganie na "zwykłej angielskiej" interpretacji specyfikacji przez strony trzecie spowoduje, że wykonasz złą pracę.

Powiązane problemy