इस लाइन का क्या मतलब है?

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

इस सिंटैक्स का क्या अर्थ है socket.socket() और सॉकेट.AF_INET`? क्या हम पैरामीटर के रूप में केवल AF_INET और Stream का उपयोग नहीं कर सकते?

import socket # for socket
import sys 

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print "Socket successfully created"
except socket.error as err:
    print "socket creation failed with error %s" %(err)

# default port for socket
port = 80

try:
    host_ip = socket.gethostbyname('www.google.com')
except socket.gaierror:

    # this means could not resolve the host
    print "there was an error resolving the host"
    sys.exit()

# connecting to the server
s.connect((host_ip, port))

print "the socket has successfully connected to google \
on port == %s" %(host_ip)
-1
Aayush 31 मार्च 2018, 10:10

3 जवाब

सबसे बढ़िया उत्तर

कई पायथन मानक पुस्तकालय अंतर्निहित सिस्टम पुस्तकालयों के आसपास काफी पतले आवरण हैं। वे अंतर्निहित OS सुविधाओं की कई विशिष्टताओं को उजागर करते हैं, और आपको उनके शब्दार्थ को ठीक से समझने के लिए अंतर्निहित प्रणाली से परिचित होना होगा।

यदि आप वास्तव में सॉकेट्स को समझना चाहते हैं, तो विषय के लिए कई उत्कृष्ट परिचय हैं। उनमें से अधिकांश को सी के साथ कुछ परिचित होने की आवश्यकता होगी, जो थोड़ा विचलित हो सकता है (लेकिन सी की मूल बातें समझना शायद आपके समय का एक अच्छा निवेश है यदि आप कोड को पढ़ने और लिखने में अधिक खर्च करने की उम्मीद करते हैं)।

आप अंतर्निहित सुविधाओं के उचित इनकैप्सुलेशन के साथ पायथन socket मॉड्यूल के लिए अधिक पाइथोनिक प्रतिस्थापन बना सकते हैं। हालांकि, यह स्पष्ट नहीं है कि यह किसी उपयोगी उद्देश्य की पूर्ति करेगा या नहीं। सॉकेट्स के अधिकांश तुच्छ उपयोग "कॉपी/पेस्ट प्रोग्रामिंग" के थोड़े से अपारदर्शी लेकिन सामान्य पर्याप्त टुकड़ों के साथ मिलते हैं, जो कि अधिकांश पाठक मोटे तौर पर समझेंगे कि कोड में क्या हो रहा है; अन्य पर्याप्त रूप से शामिल हैं कि उन्हें अंतर्निहित सुविधा तक पूर्ण पहुंच और समझ की आवश्यकता है।

1
tripleee 31 मार्च 2018, 08:29

ऑब्जेक्ट नाम नेमस्पेस में रहते हैं - एक स्पेस जिसमें नाम होते हैं। एक मॉड्यूल (उदाहरण के लिए, socket) का अपना नाम स्थान होता है। वाक्यविन्यास है:

namespace.name

तो socket.socket का अर्थ है socket नाम (जो एक फ़ंक्शन होता है) socket मॉड्यूल से - मॉड्यूल का नाम पहले आता है फिर फ़ंक्शन का नाम। यदि हम नाम स्थान को छोड़ देते हैं तो यह वर्तमान मान लेता है, जिसे एक साधारण एकल फ़ाइल प्रोग्राम में __main__ कहा जाता है।

हम इसे व्यवस्थित कर सकते हैं ताकि हम अपने नामस्थान में नाम आयात करें और मॉड्यूल नाम निर्दिष्ट करने की आवश्यकता न हो, जो आपने मांगा है:

from socket import *

लेकिन यह कुछ कारणों से खतरनाक है और इसे नाम स्थान प्रदूषण कहा जाता है।

एक यह है कि हम आसानी से यह निर्धारित नहीं कर सकते कि कुछ कहां से आता है - आपके द्वारा दिखाया गया कोड काफी छोटा है और विशिष्ट नहीं है।

दूसरा कारण नामस्थान टकराव है। क्या होगा यदि दो मॉड्यूल एक ही नाम का उपयोग करते हैं, उदाहरण के लिए closedown? अंतिम परिभाषित वह है जिसका उपयोग किया जाएगा - कोई चेतावनी नहीं होगी कि एक ने दूसरे को मुखौटा कर दिया है क्योंकि अजगर को गतिशील होने के लिए डिज़ाइन किया गया है।

तो हम जानते हैं कि socket.socket socket मॉड्यूल से आता है, न कि कार टूल्स या इलेक्ट्रिकल सर्किट से संबंधित किसी मॉड्यूल का वर्णन करने वाले मॉड्यूल से। यदि हम चाहें तो एक ही प्रोग्राम में तीनों का उपयोग कर सकते हैं, लेकिन हमें पहले नेमस्पेस निर्दिष्ट करना होगा।

दुर्भाग्य से आप from module import * काफी देखेंगे क्योंकि लोग आलसी होते हैं। आप एक छोटे से कार्यक्रम में इससे बच सकते हैं लेकिन आप जोखिम उठा रहे होंगे - समय के साथ कार्यक्रम केवल बड़े और अधिक जटिल होते जाते हैं, वे कभी भी छोटे और सरल नहीं होते हैं।

import का उपयोग करने के अन्य तरीके हैं: आप केवल कुछ नामों के आयात को प्रतिबंधित कर सकते हैं और आप उपनाम बना सकते हैं, लेकिन आपको उनका उपयोग करने से पहले प्रोग्रामिंग के बारे में अधिक सीखना चाहिए। उनके अपने उपयोग हैं लेकिन जब वे उपयुक्त होते हैं तो निर्णय निर्णय होता है।

3
cdarke 31 मार्च 2018, 08:09

आपने socket मॉड्यूल आयात कर लिया है, इसलिए उस मॉड्यूल से जो कुछ भी आप उपयोग करते हैं, उसके सामने "socket." होगा।

तो socket.socket() का अर्थ है socket() फ़ंक्शन को socket मॉड्यूल से चलाएं।

आपको socket.AF_INET लिखना है क्योंकि AF_INET भी socket मॉड्यूल से है, इसलिए इसका मतलब है कि socket मॉड्यूल से AF_INET स्थिरांक प्राप्त करें। socket.SOCK_STREAM के लिए भी ऐसा ही तर्क लागू होता है।

सॉकेट के बारे में अधिक जानकारी के लिए: https://docs.python.org/2/library/socket .html

साथ ही, सामान्य रूप से कोड सीखने के मामले में, कोड की प्रतिलिपि बनाना और फिर उसे समझने की कोशिश करना काम कर सकता है, लेकिन अंतर्निहित अवधारणाओं को समझने की कोशिश करना और फिर अपना कोड लिखना कहीं अधिक शक्तिशाली है।

2
DarthVlader 31 मार्च 2018, 15:21