2017-01-11 117 views
3

我使用套接字編程在Python中創建一個簡單的聊天應用程序無限連接,我需要我的插座接受這個不像「socket.listen(100)」,這是僅限於100連接的無限量請解釋我該怎麼處理大量的連接?接受插座

+0

你有無限的帶寬爲您的無限連接? –

+0

是的,我有一個無限帶寬的VPS。 – Matarata

+1

「socket.listen」的參數是尚未被「接受」的未決連接的最大數目。它不限制已建立的連接數量。 – jasonharper

回答

3

listen()給定的數字是積壓隊列的大小 - 一個暗示到待決請求的數目,不活動的請求的數目。

您會經常看到用於積壓的5參數 - 這是歷史數據。 Berkeley套接字的早期版本有一個「特徵」,其中任何大於5的值都給出了5。這是很久以前固定的,但它仍然不是一個數字,你需要太多的擔心 - 記住,這只是一個提示。

如果積壓超過,給客戶端的實際錯誤通常是全部ECONNREFUSED,但舊系統曾經有特定的積壓錯誤。

在許多系統上積壓悄悄地截取到SOMAXCONN

另請參見listen() ignores the backlog argument?

1

你想有一個接受()循環,它只是接受()新的連接,並開始一個新的線程來處理每一個。每當有人試圖連接時,它立即接受它們並將它們添加到連接列表中。

每個連接一個線程,用長超時,無論你想你的會話空閒超時被讀取。如果超時過期,則關閉套接字並退出線程。

如果服務器用完了文件描述符,這會如果有足夠的併發連接,接受()將開始與相應的errno失敗:在這種情況下,你只是忽略它,並不斷循環。也許你會在這種情況下減少空閒超時時間,然後在接受再次開始工作時將其放回原處。

你正在看問題有點不對。使用服務器端套接字,您可以接受到同一套接字的連接,然後由其他進程/線程處理。

# 
# Setup socket and other handling stuff here 
# 

while True: 
    conn = sock.accept() 
    thread.start_new_thread(handler, (conn,)) 

根據您系統的內存,最大套接字數將會有一個實際的限制。

http://docs.python.org/2/library/socketserver.html。我認爲最後幾個例子(在Asynchronous Mixins下)非常接近你想要實現的。