連接->傳輸數據->關閉連接
比如HTTP是無狀態的的短鏈接,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。
具體就是 瀏覽器client發起並建立TCP連接 -> client發送HttpRequest報文 -> server接收到報文->server handle並發送HttpResponse報文給前端,發送完畢之后立即調用socket.close方法->client接收response報文->client最終會收到server端斷開TCP連接的信號->client 端斷開TCP連接,具體就是調用close方法。
也可以這樣說:短連接是指SOCKET連接后,發送接收完數據后馬上斷開連接。
因為連接后接收了數據就斷開了,所以每次數據接受處理不會有聯系。 這也是HTTP協議無狀態的原因之一。
長連接
連接->傳輸數據->保持連接 -> 傳輸數據-> ...........->直到一方關閉連接,多是客戶端關閉連接。
長連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
每次我們訪問PHP腳本的時候,都是當所有的PHP腳本執行完成后,我們才得到返回結果。如果我們需要一個腳本持續的運行,那么我們就要通過php長連接的方式,來達到運行目的。
一般php環境為apache+php+linux,但是由於apache對php連接都有時間限制,一般超過這個連接時間apache服務器會自動斷掉連接。
這種情況下比較簡單方便的方式就是在php頁面中設置set_time_limit(0)(當然也可以在php.ini配置文件中設置,但是這樣對整個環境產生影響,畢竟我們並不想對所有連接都可以長時間連接,影響服務性能)
每個PHP腳本都限制了執行時間,所以我們需要通過 set_time_limit 來設置一個腳本的執行時間為無限長,然后使用 flush() 和 ob_flush() 來清除服務器緩沖區,隨時輸出腳本的返回值。
<?php header("Content-Type: text/plain"); set_time_limit(0); while( true ) { // 持續執行的腳本 flush(); ob_flush(); sleep(5); } ?>
當我們執行后,每隔5秒鍾,我們會執行一次,通過這一方法,我們可以完成很多功能,例如后台監控程序,定時執行功能,日志分析,數據整理等耗時的操作。
什么時候用長連接,短連接?
長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。
例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。
總之,長連接和短連接的選擇要視情況而定。
具體網絡中的應用的話:
http 1.0一般就指短連接,smtp,pop3,telnet這種就可以認為是長連接。一般的網絡游戲應用都是長連接