要明白HTTP長連接,得先明白Socket連接什么是Socket?百度一下,根本看不懂要理解Socket,得先理解TCP
TCP是傳輸層協議,有linux、windows等操作系統實現
Socket是對TCP協議抽象出來的上層接口,供操作系統上層的應用程序使用上層應用程序來使用socket,比如Tomcat、比如瀏覽器
瀏覽器在發送一個請求時,先得建立一個Socket,比如:
Socket socket = new Socket("localhost", 8081);
建立完Socket連接之后,瀏覽器開始構造數據,通過OutputStream發送出去。
這里涉及到Socket服務端的幾個問題。
如果服務端Socket沒有使用InputSteam來接收數據,那么數據存在哪了。
對于服務端Socket,有一個recvbuf來存儲數據
所以JAVA中,在利用InputSteam去read數據時,是從recvbuf來讀取數據的,演示一下read方法:
- 如果沒有使用read會怎么樣
- 如果使用了read,那么read方法的返回值表示什么意思?
當從recvbuf得到的數據是字節,所以需要去解析數據。
比如Tomcat從Socket得到數據之后,就需要解析數據,那么怎么解析呢?
解析數據,解析請求行,請求頭解析完數據之后,接下來該如何?
這里就是所謂的長連接和短連接。
比如Tomcat解析完某個HTTP請求,并調用了Servlet之后,就會判斷是否需要關閉Socket。
那該如何判斷呢?
- 判斷請求頭Connnection,如果是close則關閉socket,如果是keep-alive,則不關閉
- 判斷keepAliveTimeout、maxConnections、maxKeepAliveRequests
maxKeepAliveRequests:一個socket連接所能處理的request個數,達到了上限則關閉,默認為100keepAliveTimeout:Tomcat會不停的從socket中讀取數據,如果在指定的keepAliveTimeout時間內沒有讀到數據,則關閉該socket,默認為20smaxConnections:Tomcat的并發控制,同時只支持maxConnections個socket,bio默認為200.