亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 套接字 Accept 超時(shí)問題解析

 更新時(shí)間:2023年06月08日 09:32:31   作者:跡憶客  
本文討論了 Python 中套接字的超時(shí)功能,該功能對于緩解無限期等待套接字接受的問題是必要的,下面通過本文給大家大家介紹Python 套接字 Accept 超時(shí)問題,需要的朋友可以參考下

套接字是網(wǎng)絡(luò)通信的基本構(gòu)建塊。 每當(dāng)兩個(gè)網(wǎng)絡(luò)實(shí)體需要傳輸數(shù)據(jù)時(shí),就會(huì)打開一個(gè)套接字。

這些套接字在會(huì)話期間保持連接。 但有時(shí),在 Python 中使用套接字時(shí),您可能會(huì)等待很長時(shí)間,而另一端仍然接受套接字連接。

本文討論了 Python 中套接字的超時(shí)功能,該功能對于緩解無限期等待套接字接受的問題是必要的。

套接字接受、拒絕和超時(shí)

每當(dāng)您嘗試使用 Python 腳本建立與服務(wù)器的連接時(shí),您都需要打開一個(gè)套接字連接。 此套接字連接充當(dāng)在客戶端和服務(wù)器之間傳輸數(shù)據(jù)的隧道。

在打開socket的過程中,有三種場景。

  • Socket Accept:當(dāng)socket打開成功,此時(shí)服務(wù)端和客戶端已經(jīng)建立連接,可以收發(fā)數(shù)據(jù),我們稱之為socket accept。 這個(gè)場景就是打開一個(gè)socket的最終目的。Socket reject:假設(shè)您打開了一個(gè)套接字但傳遞了一些不同的參數(shù),忘記傳遞參數(shù)或沒有正確遵循打開套接字的過程; 你會(huì)得到拒絕。 這意味著無法建立發(fā)送和接收數(shù)據(jù)的連接。Socket Accept 超時(shí):這是一個(gè)重要但被忽視的場景。 有時(shí)當(dāng)您嘗試打開一個(gè)套接字時(shí),您可能不會(huì)從另一端得到任何響應(yīng)。
  • 因此,您將永遠(yuǎn)等待。 這是一種不受歡迎的情況,因?yàn)槟腙P(guān)閉當(dāng)前請求并嘗試另一個(gè)請求,而不是永遠(yuǎn)等待。
  • 超時(shí)選項(xiàng)允許您設(shè)置最長等待時(shí)間以使您的請求被另一方接受。 超過時(shí)間限制后,將引發(fā)錯(cuò)誤。

套接字方法及其在 Python 中的使用

Python 有一個(gè)名為 socket 的內(nèi)置庫,您需要導(dǎo)入它才能使用套接字連接。 讓我們看看套接字庫的一些重要方法。

  • accept():顧名思義,accept() 方法接受來自另一方的傳入套接字請求。 此方法返回一個(gè)套接字連接,您可以使用它在連接的實(shí)體之間傳輸數(shù)據(jù)。bind():此方法將套接字連接綁定或附加到地址。 如果您想使用套接字,則必須調(diào)用此方法。
  • bind() 方法接受一個(gè) IP 地址元組和它綁定套接字的端口。
  • listen():這是一個(gè)服務(wù)器端方法,它使服務(wù)器能夠接受套接字以在連接之間傳輸數(shù)據(jù)。
  • connect():此方法接受一個(gè)地址作為參數(shù)。 然后它在該地址連接遠(yuǎn)程套接字。
  • settimeout():此方法接受一個(gè)非零數(shù)字作為引發(fā) TimeoutError 之前等待的秒數(shù)。 此方法對于緩解無限等待時(shí)間的問題很重要。
  • setdefaulttimeout():如果您使用多個(gè)套接字連接并希望為每個(gè)連接設(shè)置相同的超時(shí)限制,那么這是您的首選方法。 它接受秒數(shù)作為參數(shù),并將其作為等待超時(shí)限制應(yīng)用于所有新的套接字連接。

Python 中的套接字接受超時(shí)示例

讓我們在 Python 代碼的幫助下看一個(gè)套接字接受超時(shí)的例子。 對于此示例,我們需要編寫兩個(gè) Python 腳本,一個(gè)用于服務(wù)器,另一個(gè)用于客戶端。

我們將看到三種不同的場景,如下所述。

  • 第一種情況是沒有設(shè)置超時(shí)限制。 在這種情況下,客戶將繼續(xù)等待。

請注意,根據(jù)您的操作系統(tǒng),請求可能會(huì)在一段時(shí)間后自動(dòng)拒絕。

  • 第二種情況是我們使用 settimeout() 方法設(shè)置超時(shí)限制。 在這種情況下,您將在設(shè)置的限制后得到 TimeoutError。
  • 在第三種情況下,我們將使用 setdefaulttimeout() 方法來設(shè)置超時(shí)限制。

下面我們一一看看上面三種情況的代碼。

未設(shè)置超時(shí)限制時(shí) Python 中的套接字接受超時(shí)

服務(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è)置超時(shí)時(shí)Python中的套接字接受超時(shí)

在這種情況下,您會(huì)看到客戶端在超過超時(shí)時(shí)間后中止操作并引發(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))

在這種情況下,會(huì)引發(fā) Python 套接字 TimeoutError。 請注意,套接字的行為可能因平臺(tái)而異。

在 Linux 機(jī)器上,套接字拋出 ConnectionRefusedError: [Errno 111] Connection refused 錯(cuò)誤,直到您不接受服務(wù)器端的套接字。

在 Python 中為每個(gè)套接字設(shè)置默認(rèn)超時(shí)

此方法將為所有新套接字設(shè)置相同的默認(rèn)超時(shí)。 這樣,您可以通過為每個(gè)套接字單獨(dú)設(shè)置超時(shí)來節(jié)省時(shí)間和麻煩。

服務(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() ,您必須直接使用套接字類而不是對象,因?yàn)樗鼮樗芯€程設(shè)置超時(shí)。

總結(jié)

套接字超時(shí)是 Python 套接字編程的一個(gè)重要方面。 如果您不處理超時(shí),您可能會(huì)讓您的客戶端永遠(yuǎn)等待套接字。

或者在其他情況下,根據(jù)您的環(huán)境實(shí)現(xiàn),它可能會(huì)引發(fā)錯(cuò)誤。

到此這篇關(guān)于Python 套接字 Accept 超時(shí)的文章就介紹到這了,更多相關(guān)Python 套接字Accept 超時(shí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論