2012-11-28 30 views
6

Piszę serwer HTTP z Netty. Ustawiam opcję keep-alive, gdy tworzę bootstrap serwera. bootstrap.setOption("child.keepAlive", true); Za każdym razem, gdy piszę odpowiedź HTTP, ustawiam nagłówek keep-alive i zamykam kanał po zapisaniu odpowiedzi.Netty: Czy powinienem zamknąć Kanał, jeśli jest to połączenie typu "keep-alive"?

Nie jestem pewien, czy mam zamknąć kanał.

+0

Trudno zobaczyć, co to jest tajemnica. Nie możesz poważnie myśleć, że zamknięcie kanału to utrzymanie go przy życiu. – EJP

Odpowiedz

7

Zakładając, że piszesz serwer HTTP 1.1, powinieneś domyślnie pozostawić połączenie otwarte po wysłaniu odpowiedzi. Jeśli z jakiegoś powodu zdecydujesz się na jego zamknięcie, należy podać odpowiedź w postaci

Connection: close 

.

Zauważ, że

bootstrap.setOption("child.keepAlive", true); 

włącza opcji utrzymywania aktywności w gnieździe i nie ma nic wspólnego z HTTP; jest raczej rodzajem mechanika-stróża w celu wykrycia przerwanych połączeń w przypadku braku "prawdziwego" ruchu.

+1

Dzięki @ czterdzieści dwa! Moim zamiarem było utrzymać połączenie przy życiu. Aby to potwierdzić: czy potrzebuję tej części '.addListener (ChannelFutureListener.CLOSE)' po zakończeniu pisania odpowiedzi? – woodings

+0

Dla większości systemów operacyjnych domyślny limit czasu "SO_KEEPALIVE" jest bardzo długi (na przykład 7200 sekund w systemie Linux), więc nie oczekiwałbym od niego zbyt wiele. Powinieneś po prostu zamknąć połączenie, jeśli żadne żądania nie zostały wysłane przez klienta przez określony czas. – trustin

3

Należy pamiętać, że trzeba także określić długość treści:

response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); 

tak, że odbiornik może dowiedzieć się, gdzie nastąpił koniec komunikatu. W przeciwnym razie odbiór będzie czekał na wiadomość.

I, dla jasności, nie powinieneś pisać ".addListener (ChannelFutureListener.CLOSE);" jeśli chcesz, aby twoje połączenie pozostało otwarte.