यह select
कॉल से शुरू होता है। यह फ़ंक्शन सॉकेट सेट करता है और ऐसा होने के लिए कुछ उल्लेखनीय प्रतीक्षा करता है। पहली सूची में सॉकेट के लिए, "ध्यान देने योग्य" का अर्थ है कि सॉकेट में पढ़ने के लिए डेटा उपलब्ध है।
rlist, wlist, xlist = select.select([listening_socket] + open_sockets, [], [])
कोड अब पढ़ने के लिए तैयार डेटा, और कृत्यों सॉकेट के प्रकार के आधार के साथ सॉकेट की सूची के माध्यम से iterates संभाला जा रहा।
for i in rlist:
if i is listening_socket:
कनेक्शन-उन्मुख ("सुनना") सॉकेट का उपयोग नए कनेक्शन को स्वीकार करने के लिए किया जाता है। चूंकि यह rlist
में है, हम जानते हैं कि हमारे पास "पढ़ने" के लिए कुछ है। एक सुनवाई सॉकेट के संदर्भ में, इसका मतलब है कि एक नया कनेक्शन प्राप्त हुआ है। इसलिए हम कनेक्शन स्वीकार करते हैं, और open_sockets
की सूची में नई सॉकेट को सहेजते हैं।
new_socket, addr = listening_socket.accept()
open_sockets.append(new_socket)
सॉकेट नहीं listening_socket
है, तो यह एक सॉकेट जो है (या था) किसी दूरस्थ क्लाइंट से जुड़ा है। और फिर से यह rlist
में है, हम जानते हैं कि हमारे पास "पढ़ने" के लिए कुछ है। कनेक्टेड सॉकेट के संदर्भ में, इसका मतलब है कि डेटा वास्तव में पढ़ने के लिए उपलब्ध है, या सॉकेट बंद कर दिया गया है।
तो हम recv
फोन किसी भी उपलब्ध डेटा,
else:
data = i.recv(1024)
हो और अगर हम वास्तव में कुछ भी पढ़ा है देखने के लिए। यदि कोई डेटा उपलब्ध नहीं था, तो कनेक्शन बंद होना चाहिए, इसलिए हम सॉकेट ऑब्जेक्ट को बंद करते हैं और open_sockets
से इसे हटा देते हैं।
if data == "":
i.close()
open_sockets.remove(i)
print "Connection closed"
यदि हमें वास्तव में डेटा प्राप्त होता है, तो हम इसे वापस ग्राहक को लिखते हैं और स्क्रीन पर प्रिंट करते हैं।
else:
i.send(data)
print repr(data)
select
करने के लिए पहली कॉल जब तक एक कनेक्शन प्राप्त होता है इंतजार करेंगे।आप के रूप में
print "About to call select"
rlist, wlist, xlist = select.select([listening_socket] + open_sockets, [], [])
print "Returned from select"
खुद के लिए देख सकते हैं कोड अपडेट करके पहली कॉल करने के बाद, rlist
listening_socket
शामिल होंगे। हम इसे जानते हैं क्योंकि open_sockets
खाली है, और select
कहा जाता है जब तक कि कुछ पढ़ा नहीं जाता है तब तक वापस नहीं आ जाएगा। इसलिए हम नए कनेक्शन को स्वीकार करते हैं और इसे open_sockets
में जोड़ते हैं।
जब select
फिर से कहा जाता है, तो तीन संभावित घटनाएं होती हैं। सबसे पहले, listening_socket
शायद एक और कनेक्शन प्राप्त हो सकता है। इस मामले में इसे पहले के रूप में संभाला जाता है: हम कनेक्शन स्वीकार करते हैं और इसे open_sockets
में जोड़ते हैं।
दूसरा, नया कनेक्शन डेटा प्राप्त कर सकता था। चूंकि select
ने इसे rlist
में शामिल किया है, इसलिए हम जानते हैं कि डेटा सॉकेट से "पढ़ने" के लिए तैयार है (जिसका अर्थ है कि डेटा पढ़ने के लिए तैयार है, या सॉकेट बंद कर दिया गया है)। i.recv
नया डेटा लौटाएगा।
तीसरा, नया कनेक्शन बंद हो सकता था। चूंकि select
ने इसे rlist
में शामिल किया है, इसलिए हम जानते हैं कि डेटा सॉकेट से पढ़ने के लिए तैयार है (ऊपर जैसा ही अर्थ है)। लेकिन i.recv
वापस आ जाएगा क्योंकि सॉकेट में कोई नया डेटा नहीं है। तो हम जानते हैं कि सॉकेट बंद कर दिया गया है, और तदनुसार साफ करें।
यदि क्लाइंट से कोई डेटा नहीं भेजा गया है (और कनेक्शन अभी भी खुला है), तो select
इसमें rlist
में शामिल नहीं होगा। तो लूप इसे संसाधित नहीं करेगा, और i.recv
उस विशेष सॉकेट पर नहीं बुलाया जाएगा।
जब तक रहो अगर किसी भी प्रदान किए गए किसी ने आपके प्रश्न का उत्तर दिया है तो उत्तर स्वीकार करना सुनिश्चित करें। इस साइट पर योगदान करने वाले लोगों का धन्यवाद करने का यह एक अच्छा तरीका है। अगर आपके प्रश्न का उत्तर नहीं दिया गया है, तो हमेशा टिप्पणी करने में संकोच न करें। धन्यवाद! – GargantuChet