Python 套接字 Accept 超時問題解析
套接字是網(wǎng)絡(luò)通信的基本構(gòu)建塊。 每當兩個網(wǎng)絡(luò)實體需要傳輸數(shù)據(jù)時,就會打開一個套接字。
這些套接字在會話期間保持連接。 但有時,在 Python 中使用套接字時,您可能會等待很長時間,而另一端仍然接受套接字連接。
本文討論了 Python 中套接字的超時功能,該功能對于緩解無限期等待套接字接受的問題是必要的。
套接字接受、拒絕和超時
每當您嘗試使用 Python 腳本建立與服務(wù)器的連接時,您都需要打開一個套接字連接。 此套接字連接充當在客戶端和服務(wù)器之間傳輸數(shù)據(jù)的隧道。
在打開socket的過程中,有三種場景。
- Socket Accept:當socket打開成功,此時服務(wù)端和客戶端已經(jīng)建立連接,可以收發(fā)數(shù)據(jù),我們稱之為socket accept。 這個場景就是打開一個socket的最終目的。Socket reject:假設(shè)您打開了一個套接字但傳遞了一些不同的參數(shù),忘記傳遞參數(shù)或沒有正確遵循打開套接字的過程; 你會得到拒絕。 這意味著無法建立發(fā)送和接收數(shù)據(jù)的連接。Socket Accept 超時:這是一個重要但被忽視的場景。 有時當您嘗試打開一個套接字時,您可能不會從另一端得到任何響應(yīng)。
- 因此,您將永遠等待。 這是一種不受歡迎的情況,因為您想關(guān)閉當前請求并嘗試另一個請求,而不是永遠等待。
- 超時選項允許您設(shè)置最長等待時間以使您的請求被另一方接受。 超過時間限制后,將引發(fā)錯誤。
套接字方法及其在 Python 中的使用
Python 有一個名為 socket 的內(nèi)置庫,您需要導(dǎo)入它才能使用套接字連接。 讓我們看看套接字庫的一些重要方法。
- accept():顧名思義,accept() 方法接受來自另一方的傳入套接字請求。 此方法返回一個套接字連接,您可以使用它在連接的實體之間傳輸數(shù)據(jù)。bind():此方法將套接字連接綁定或附加到地址。 如果您想使用套接字,則必須調(diào)用此方法。
- bind() 方法接受一個 IP 地址元組和它綁定套接字的端口。
- listen():這是一個服務(wù)器端方法,它使服務(wù)器能夠接受套接字以在連接之間傳輸數(shù)據(jù)。
- connect():此方法接受一個地址作為參數(shù)。 然后它在該地址連接遠程套接字。
- settimeout():此方法接受一個非零數(shù)字作為引發(fā) TimeoutError 之前等待的秒數(shù)。 此方法對于緩解無限等待時間的問題很重要。
- setdefaulttimeout():如果您使用多個套接字連接并希望為每個連接設(shè)置相同的超時限制,那么這是您的首選方法。 它接受秒數(shù)作為參數(shù),并將其作為等待超時限制應(yīng)用于所有新的套接字連接。
Python 中的套接字接受超時示例
讓我們在 Python 代碼的幫助下看一個套接字接受超時的例子。 對于此示例,我們需要編寫兩個 Python 腳本,一個用于服務(wù)器,另一個用于客戶端。
我們將看到三種不同的場景,如下所述。
- 第一種情況是沒有設(shè)置超時限制。 在這種情況下,客戶將繼續(xù)等待。
請注意,根據(jù)您的操作系統(tǒng),請求可能會在一段時間后自動拒絕。
- 第二種情況是我們使用
settimeout()
方法設(shè)置超時限制。 在這種情況下,您將在設(shè)置的限制后得到 TimeoutError。 - 在第三種情況下,我們將使用
setdefaulttimeout()
方法來設(shè)置超時限制。
下面我們一一看看上面三種情況的代碼。
未設(shè)置超時限制時 Python 中的套接字接受超時
服務(wù)器端腳本:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客戶端腳本
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1717))
您在服務(wù)器端看不到 listen()
方法。 因此,服務(wù)器沒有響應(yīng),客戶端正在等待。
設(shè)置超時時Python中的套接字接受超時
在這種情況下,您會看到客戶端在超過超時時間后中止操作并引發(fā) TimeoutError。
服務(wù)器端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客戶端腳本
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(3) s.connect(('127.0.0.1', 1717))
在這種情況下,會引發(fā) Python 套接字 TimeoutError。 請注意,套接字的行為可能因平臺而異。
在 Linux 機器上,套接字拋出 ConnectionRefusedError: [Errno 111] Connection refused 錯誤,直到您不接受服務(wù)器端的套接字。
在 Python 中為每個套接字設(shè)置默認超時
此方法將為所有新套接字設(shè)置相同的默認超時。 這樣,您可以通過為每個套接字單獨設(shè)置超時來節(jié)省時間和麻煩。
服務(wù)器端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客戶端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: socket.setdefaulttimeout(3) s.connect(('127.0.0.1', 1717))
請注意
,對于setdefaulttimeout()
,您必須直接使用套接字類而不是對象,因為它為所有線程設(shè)置超時。
總結(jié)
套接字超時是 Python 套接字編程的一個重要方面。 如果您不處理超時,您可能會讓您的客戶端永遠等待套接字。
或者在其他情況下,根據(jù)您的環(huán)境實現(xiàn),它可能會引發(fā)錯誤。
到此這篇關(guān)于Python 套接字 Accept 超時的文章就介紹到這了,更多相關(guān)Python 套接字Accept 超時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python數(shù)據(jù)結(jié)構(gòu)的排序算法
下面是是對python數(shù)據(jù)結(jié)構(gòu)的排序算法的一些講解及示意圖,感興趣的小伙伴一起來學(xué)習(xí)吧2021-08-08python3使用python-redis-lock解決并發(fā)計算問題
本文主要介紹了python3使用python-redis-lock解決并發(fā)計算問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10利用pycharm調(diào)試ssh遠程程序并實時同步文件的操作方法
這篇文章主要介紹了利用pycharm調(diào)試ssh遠程程序并實時同步文件的操作方法,本篇文章提供了利用pycharm遠程調(diào)試程序的方法,且使用的編譯器可以是服務(wù)器中的虛擬環(huán)境的編譯器,可以實時同步本地與服務(wù)器的文件內(nèi)容,需要的朋友可以參考下2022-11-11Python實現(xiàn)獲取系統(tǒng)臨時目錄及臨時文件的方法示例
這篇文章主要介紹了Python實現(xiàn)獲取系統(tǒng)臨時目錄及臨時文件的方法,結(jié)合實例形式分析了Python文件與目錄操作相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下2019-06-06tensorflow 實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換
今天小編就為大家分享一篇tensorflow 實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02