पायथन की स्टैंडर्ड लाइब्रेरी में 'socket' मॉड्यूल परिभाषित करता है कि सर्वर और क्लाइंट मशीनें ऑपरेटिंग सिस्टम के ऊपर सॉकेट एंडपॉइंट्स का उपयोग करके कैसे संचार कर सकती हैं। 'socket' API में कनेक्शन-ओरिएंटेड और कनेक्शनलेस दोनों नेटवर्क प्रोटोकॉल के लिए फ़ंक्शन्स होते हैं।
सॉकेट टू-वे कम्युनिकेशन लिंक का एक एंडपॉइंट है। इसकी विशेषता IP एड्रेस और पोर्ट नंबर है। सर्वर और क्लाइंट दोनों सिरों पर सॉकेट्स का उचित कॉन्फ़िगरेशन आवश्यक है ताकि कनेक्शन शुरू किया जा सके। इससे इनकमिंग मैसेजेस को सुनना और फिर क्लाइंट-सर्वर वातावरण में रिस्पॉन्स भेजना संभव होता है।
सॉकेट ऑब्जेक्ट बनाना
'socket' मॉड्यूल में socket() फ़ंक्शन एक सॉकेट ऑब्जेक्ट सेट करता है:
import socket obj = socket.socket(family, type, protocol)
'family' तर्क डिफ़ॉल्ट रूप से AF_INET है। अन्य स्वीकार्य मान हैं: AF_INET6, AF_UNIX, AF_CAN या AF_RDS। 'type' तर्क का मान डिफ़ॉल्ट रूप से 'SOCK_STREAM' है जो कनेक्शन-ओरिएंटेड प्रोटोकॉल (TCP) को इंगित करता है। कनेक्शनलेस प्रोटोकॉल (UDP) के लिए इसे 'SOCK_DGRAM' पर सेट करें। 'protocol' तर्क आमतौर पर डिफ़ॉल्ट रूप से 0 पर सेट होता है।
सर्वर और क्लाइंट पर सॉकेट ऑब्जेक्ट्स को क्रमशः सर्वर सॉकेट और क्लाइंट सॉकेट कहा जाता है। सॉकेट ऑब्जेक्ट निम्न मेथड्स को लागू करता है:
| bind() | यह मेथड सॉकेट को निर्दिष्ट IP एड्रेस और पोर्ट नंबर से बांधता है। |
| listen() | यह मेथड सर्वर शुरू करता है और क्लाइंट से कनेक्शन रिक्वेस्ट की तलाश में एक लिसन लूप में चला जाता है। |
| accept() | जब सर्वर द्वारा कनेक्शन रिक्वेस्ट इंटरसेप्ट की जाती है, तो यह मेथड इसे स्वीकार करता है और क्लाइंट सॉकेट को उसके एड्रेस के साथ पहचानता है। |
सामान्य सर्वर-साइड कोड
import socket
ss = socket.socket()
ss.bind(('localhost', 12345))
ss.listen()
client, addr = ss.accept()
print("connection request from: " + str(addr))
यदि स्थानीय मशीन का उपयोग सर्वर के रूप में किया जाता है ताकि उसी मशीन से क्लाइंट के रूप में इनकमिंग मैसेजेस सुने जा सकें, तो इसका IP एड्रेस '127.0.0.1' होता है जिसे लूपबैक एड्रेस भी कहा जाता है। इसकी पहचान 'localhost' होस्टनेम से होती है। सॉकेट को मनमाने खाली पोर्ट नंबर पर सुनने के लिए बनाया जाता है। नेटवर्क में दूरस्थ मशीनों के बीच संचार के लिए वास्तविक IP एड्रेस का उपयोग किया जाना चाहिए।
क्लाइंट कनेक्शन
connect()
obj = socket.socket() obj.connect((host, port))
एक बार क्लाइंट से कनेक्शन रिक्वेस्ट सर्वर द्वारा स्वीकार कर लेने के बाद, दोनों सॉकेट ऑब्जेक्ट्स अब TCP प्रोटोकॉल का उपयोग करके कनेक्टेड हैं और वे डेटा भेज और/या प्राप्त कर सकते हैं।
send()
सर्वर उस एड्रेस का उपयोग करके क्लाइंट को डेटा भेजता है जिसे उसने इंटरसेप्ट किया है।
client.send(bytes)
क्लाइंट सॉकेट उस सॉकेट को डेटा भेजता है जिससे उसने कनेक्शन स्थापित किया है।
obj.send(bytes)
sendall()
send() के समान। यह मेथड तब तक डेटा भेजना जारी रखता है जब तक सभी डेटा भेज नहीं दिया जाता।
sendto()
यह मेथड केवल UDP प्रोटोकॉल के मामले में उपयोग किया जाता है।
recv()
यह मेथड क्लाइंट को भेजे गए डेटा को पुनर्प्राप्त करने के लिए उपयोग किया जाता है। सर्वर के मामले में, यह उस रिमोट सॉकेट का उपयोग करता है जिसकी रिक्वेस्ट स्वीकार की गई है।
client.recv(bytes)
क्लाइंट के मामले में:
obj.recv(bytes)
recvfrom()
यह मेथड UDP प्रोटोकॉल के मामले में उपयोग किया जाता है।
सर्वर कोड
import socket
host = "127.0.0.1"
port = 12345
ss = socket.socket()
ss.bind((host, port))
ss.listen()
cs, addr = ss.accept()
print("Connection from: " + str(addr))
while True:
data = cs.recv(1024).decode()
if not data:
break
print("from connected user: " + str(data))
print("Received from User: " + str(data))
data = input("type message: ")
cs.send(data.encode())
cs.close()
क्लाइंट कोड
import socket
host = '127.0.0.1'
port = 12345
obj = socket.socket()
obj.connect((host, port))
message = input("type message: ")
while message != 'q':
obj.send(message.encode())
data = obj.recv(1024).decode()
print('Received from server: ' + data)
message = input("type message: ")
obj.close()
दो कमांड प्रॉम्प्ट विंडोज़ खोलें। एक में पहले सर्वर कोड चलाएं। फिर दूसरे में क्लाइंट कोड चलाएं।
