Python--長連線與短連結(TCP)
阿新 • • 發佈:2018-12-16
HTTP的長連線和短連線本質上是TCP長連線和短連線
1.短連結
瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束就中斷連線。如果客戶端瀏覽器訪問的某個HTML或其他型別的 Web頁中包含有其他的Web資源,如JavaScript檔案、影象檔案、CSS檔案等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話。
(1)client向server 發起連線請求
(2)server 接到請求,雙方建立連線
(3)client 向 server 傳送訊息
(4)server 迴應 client
(5)一次讀寫完成,此時雙方任何一個都可以發起 close 操作
Python兩種方法實現url的短連線
一、使用雜湊庫自定義演算法
用途:1.文字中顯示的url太長混亂,或採用省略顯示的方式 2.防止hash值被破解,可以在生成md5值的時候加入salt. 程式碼示例: import hashlib def get_md5(s): s = s.encode('utf8') if isinstance(s, unicode) else s m = hashlib.md5() m.update(s) return m.hexdigest() code_map = ( 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' , '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' ) def get_hash_key(long_url): hkeys = [] hex = get_md5(long_url) for i in xrange(0, 4): n = int(hex[i*8:(i+1)*8], 16) v = [] e = 0 for j in xrange(0, 5): x = 0x0000003D & n e |= ((0x00000002 & n ) >> 1) << j v.insert(0, code_map[x]) n = n >> 6 e |= n << 5 v.insert(0, code_map[e & 0x0000003D]) hkeys.append(''.join(v)) return hkeys if __name__ == '__main__': print get_hash_key('http://pythontab.com')
二、使用libsurl庫
支援 bit.ly 和 tinyurl 等短url 服務網站
2. 長連線
服務端和客戶端建立tcp長連線,如果傳送方輸出流未進行關閉,接收方就不會認為結束,一直會等待到超時。 1)client 向 server 發起連線 (2)server 接到請求,雙方建立連線 (3)client 向 server 傳送訊息 (4)server 迴應 client (5)一次讀寫完成,連線不關閉 (6)後續讀寫操作… (7)長時間操作之後client發起關閉請求 程式碼: import requests client=requests.session() headers = {'Content-Type': 'application/json', 'Connection': 'keep-alive'} where True: url=myqueue.get() r=client.get(url,headers=headers) print r.status_code
優缺點分析:
(1)長連線可以省去較多的TCP建立和關閉的操作,節約時間。但是如果使用者量太大容易造成伺服器負載過高最終導致服務不可用,
(2)短連線對於伺服器來說實現起來較為簡單,存在的連線都是有用的連線,不需要額外的控制手段。但是如果使用者訪問量很大, 往往可能在很短時間內需要建立大量的連線,造成伺服器響應速度過慢
(3)小的WEB網站的http服務一般都用短連結,因為長連線對於服務端來說會耗費一定的資源來讓套接字保持存活。
(4)對於中大型WEB網站一般都採用長連線,好處是響應使用者請求的時間更短,使用者體驗更好,雖然更耗硬體資源一些,但這都不是事兒。另外,資料庫的連線用長連線,如果用短連線頻繁的通訊會造成socket錯誤。