pythonsocket心跳
A. 網路(五):socket
服務端socket要做五件事,客戶端socket要做三件事:
接下來雙方就可以通過 read() 和 write() 函數通信了,雙方也都可以通過 close() 函數主動斷開連接。
上面的例子中,我們預期的效果是客戶端點擊一次發送,給服務端發送兩條數據,服務端觸發兩次「收到客戶端數據的回調」,然後分別列印:
但實際上兩條數據被合並成一條數據發送給服務端了,服務端只觸發了一次「收到客戶端數據的回調」,也只列印了一次:
這就是 數據粘包——多條數據被合並成了一條數據傳輸。
我們知道TCP有個 發送緩存 ,有些情況下TCP並不是有一條數據就發一條數據,而是等發送緩存滿了,再把發送緩存里的多條數據一起發送出去,這就會導致數據粘包。
此外TCP還採用了 Nagle優化演算法 來打包數據,它會將多次間隔較小且數據量較小的數據自動合並成一個比較大的數據一塊兒傳輸,這也會導致數據粘包。
處理數據粘包也很簡單,核心思路就是: 發送方在發送數據的時候先給每條數據都添加一個包頭,包頭里存放的關鍵信息就是真實數據的長度,當然也可以存放更多的業務信息,此外包頭的尾部還需要拼接一個包頭結束標識——回車換行符,以便將來接收方讀取數據時可以根據這個包頭結束標識優先讀取到包頭數據。接收方調用指定的讀取方法優先讀取到包頭數據,然後根據包頭里的長度信息再去精準讀取指定長度的真實數據,這樣就可以讀取到一條完整的數據了,然後再讀取下一條數據就不會粘包了。
正常來說,socket連接一旦建立之後就會一直掛在那裡,直到某一端主動斷開連接。但實際上,運營商在檢測到鏈路上有一段時間無數據傳輸時,就會自動斷開這種處於非活躍狀態的連接,這就是所謂的運營商NAT超時,超時時間為5分鍾。 因此我們就需要做心跳保活——即客戶端每隔一定的時間間隔就向服務端發送一個心跳數據包,用來保證當前socket連接處於活躍狀態,避免運營商把我們的連接中斷,這個時間間隔我們取的是3分鍾,伺服器在收到心跳包時不當做真實數據處理即可。
客戶端主動斷開連接時(如App退出登錄或者App進入後台等場景),我們不需要做斷線重連;其它情況下如果連接斷開了(如伺服器出了問題或者網斷了等場景),我們就需要做斷線重連,來盡量使連接處於正常連接的狀態,這樣才能保證業務的正常運行。 具體做法就是,當客戶端檢測到跟服務端斷開連接時就啟動第一次斷線重連,2秒後啟動第二次斷線重連,再隔4秒後啟動第三次斷線重連,如果三次斷線重連還沒成功,就認為是伺服器出了問題,不再重連。
B. python如何提高socket速率
python如何提高socket速率,方法如下:
1、使用非阻塞模式:使用socket的setblocking函數可以將socket設置為非阻塞模式,這樣可以避免socket處於等待狀態,從而提高速度。
2、使用多線程和多進程:利用多線程和多進程可以同時處理多個socket連接,從而提高socket速率。
3、減少數據傳輸:減少socket發送數據量,可以減少消息傳輸時間,從而提高socket速度。
4、調整TCP參數:可以通過調整網路參數,如TCP緩沖區大小,TCP超時時間等等,來提高socket速度。
Python是一種計算機編程語言,它簡單易學,功能強大,可以用來做日常任務,也可以用來開發復雜的軟體和應用程序。它的語法簡潔,易於理解,可以大大減少開發時間,節約開發費用。
C. python 如何監測進程是否關閉
如果被監測程序是你自己編寫的,那你可以在程序進程結束的時候主動去通知監測進程。
如果不是,而你要監測它的運行情況,那麼這和操作系統有關。Windows和Linux下的處理方式是不一樣的。