Python socket 基礎(Server) - Foundations of Python Socket
阿新 • • 發佈:2017-12-04
socket style sock 接收 sys 異常 屬於 ase 保留
1 Python socket 基礎 Server - Foundations of Python Socket 2 3 通過 python socket 模塊建立一個提供 TCP 鏈接服務的 server 可分為 4 個步驟, 4 1, 建立 socket 對象 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 2, 設置 socket 選項(可選) 7 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)8 在一個服務器進程終止後,操作系統通常會保留幾分端口,這樣在超時之前這個 9 端口先屬於被占用狀態,不可被其他程序使用. 若設置 SO_REUSEADDR 為 true, 10 則操作系統會在 socket 關閉後立刻釋放它的端口. 11 3, 綁定到一個端口, 或一個網卡 12 s.bind((host, port)) 13 host 參數可以為空 ‘‘, 意思是綁定到所有的地址. 14 一個 use case 是, 一臺 PC 有多個網卡, 一張網卡鏈接到公共的 Internet 上,15 另一張網卡鏈接在內部網路上。如果希望服務只對內部網路可見, 可以同過 bind() 16 方法將服務綁定到內部網路的 IP 地址上. 這樣對於通過公共的 Internet 訪問的 17 用來所來服務是不可見的。 18 4, 監聽鏈接請求 19 s.listen(5) 20 該方法通知操作系統準備接受鏈接請求. 方法接收一個 int 類型參數, 含義是指明 21 服務器處理鏈接的時候,允許有多少個等待的鏈接在隊列中 queue. 22 23響應連接請求, 24 while 1: 25 clientsocket, clientaddr = s.accept() 26 print("%s is connecting" % clientsocket.getpeername()) 27 accept()方法會 阻塞 程序, 當一個客戶端連接後才返回 28 29 異常處理, 30 任何沒有被捕獲到異常都會到時程序終止, 然而這種情況對於服務端而言是非常不好的. 31 因為異常將到時整個服務器關閉,並停止響應請求,從而不得不重啟服務端以回復服務. 32 一個健壯的服務端程序,應該捕獲任何錯誤和異常並對其做適當的處理,從而保證服務不會被終止. 33 import traceback 34 while 1: 35 try: 36 clientsocket, clientaddr = s.accept() 37 except KeyboardInterrupt as e: # Ctrl-C 可以終止程序 38 raise e 39 except: 40 traceback.print_exc() # 捕獲所以其他異常,並打印 41 continue # 下一循環,而非終止程序 42 try: 43 print("%s is connecting" % clientsocket.getpeername()) 44 except (KeyboardInterrupt,SystemExit): # Ctrl-C 和 sys.exit() 45 raise 46 except: 47 traceback.print_exc() # 打印其他異常 48 49 try: 50 clientsocket.close() # 進入第二個 try 代碼塊兒後, 51 # 無論是否有異產生 close() 方法都應該被調用. 52 except KeyboardInterrupt: # 第二,三個 try 代碼塊,可以合並成 53 # try ... finally 的結構保證 close()的調用. 54 raise 55 except: 56 traceback.print_exc()
Python socket 基礎(Server) - Foundations of Python Socket