2011-06-04 5 views
6

मान लीजिए कि एक टीसीपी सर्वर है और स्थानीयहोस्ट पर चल रहा है: 8080, एक और लिस्प बोली में जो सूचियों को समझता है। अब मैं elispEmacs Lisp नेटवर्क कनेक्शन - प्रक्रिया ऑब्जेक्ट के साथ क्या करना है?

में एक नेटवर्क कनेक्शन
setq pserv (open-network-stream plisp "test1.l" "localhost" 8080) 

खोलने के लिए और सफलतापूर्वक चर pserv के लिए एक खुला नेटवर्क प्रक्रिया वस्तु आवंटित। लेकिन फिर, अगला क्या है, मैं सर्वर पर अनुरोध भेजने के लिए इस प्रक्रिया ऑब्जेक्ट का उपयोग कैसे करूं? मैं जो करना चाहता हूं वह अन्य सर्वर (डेटा के रूप में कोड) को सूचियां भेजना है जिनका मूल्यांकन किया जाता है और परिणाम लौटाए जाते हैं।

उपरोक्त कथन में, "test1.l" प्रक्रिया से जुड़े Emacs बफर है, इसलिए परिणाम उस बफर में मुद्रित किए जाने चाहिए। क्या होगा अगर मैं वहां शून्य डालूं और प्रक्रिया किसी भी बफर से जुड़ी नहीं है - मैं एलिसिप से या प्रक्रिया ऑब्जेक्ट से सर्वर परिणामों (संभावित रूप से सूची रूप में भी) तक कैसे पहुंच सकता हूं?

एलिसप मैनुअल उस ज्ञान को स्वीकार करने के लिए प्रतीत होता है, लेकिन मैं यहां थोड़ा सा खो गया हूं। हर संकेत की सराहना की जाएगी।

उत्तर

10

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

अपने सर्वर पर डेटा भेजने के लिए, (process-send-string process string) का उपयोग करें। पहला पैरामीटर आपका नेटवर्क कनेक्शन है, जो Emacs एसिंक्रोनस प्रक्रियाओं की तरह व्यवहार करता है। जब से तुम है कि उपप्रक्रिया-वस्तु पहले से ही चर pserv में जमा हो जाती है, तो आप लिख सकते हैं:

(process-send-string pserv "(my data (can be (in) (list) form))") 

सर्वर के लिए एक स्ट्रिंग भेजने के लिए।

सर्वर के उत्तर को पढ़ने के लिए, आप process filter function का उपयोग करते हैं, जो कॉलबैक हैं जो सर्वर आपको जो भी भेजता है उसके साथ बुलाया जाता है। तो अगर आप इस तरह की पहली कॉलबैक फ़ंक्शन परिभाषित करने के लिए है, कहते हैं:

(defun handle-server-reply (process content) 
    "Gets invoked whenever the server sends data to the client." 
    ...) 

इस समारोह दो तर्क, नेटवर्क प्रक्रिया और सामग्री डेटा सर्वर भेजता है लेता है। हालांकि इसके लिए एक मुश्किल बिंदु है: सर्वर का उत्तर उप-सामग्री में विभाजित किया जा सकता है। यही है, जब handle-server-reply कहा जाता है, content तर्क में केवल सर्वर उत्तर के कुछ भाग हो सकते हैं। इसे बाद में और सामग्री के साथ फिर से बुलाया जा सकता है। तो सुनिश्चित करें कि आप इसे सही तरीके से संभाल लें।

एक कॉलबैक, उपयोग के रूप में अपने समारोह की घोषणा करने के लिए:

(set-process-filter pserv 'handle-server-reply) 

हमेशा की तरह, वर्ण एन्कोडिंग एक pita हो सकता है, तो निम्न दो कार्यों पर गौर और तय करें कि आप उन्हें जरूरत हो सकती है:

(set-process-filter-multibyte pserv t) 
(set-process-coding-system pserv 'utf-8 'utf-8) 

प्रक्रिया फ़िल्टर फ़ंक्शन निर्दिष्ट करने से पहले सुनिश्चित करें।

उदाहरण के लिए, कनेक्शन को अप्रत्याशित रूप से बंद होने वाले मामलों को संभालने के लिए, आप अपने नेटवर्क कनेक्शन की स्थिति का सर्वेक्षण करने में रुचि भी ले सकते हैं। उस के लिए आप का उपयोग sentinel functions तथाकथित, कॉलबैक का एक और प्रकार जिसके माध्यम से आप प्रक्रिया की स्थिति के परिवर्तन के बारे में सूचित कर सकते हैं:

(set-process-sentinel pserv 'sentinel-function) 

(defun sentinel-function (process event) 
    "Gets called when the status of the network connection changes." 
    ...) 

event पैरामीटर जिस तरह कनेक्शन स्थिति बदल के बारे में जानकारी शामिल है।

मुझे लगता है कि Emacs process documentation पहले बताया गया है। यह निश्चित रूप से पढ़ने लायक है।

+0

धन्यवाद थॉमस, एक बहुत विस्तृत और सहायक उत्तर! – Thorsten

+0

जो मैनुअल से व्यावहारिक रूप से कॉपी किया गया है। मैनुअल बहुत अच्छा है। आपको इसे पढ़ना चाहिए। –

+0

@nicferrier मैं सहमत हूं, यही कारण है कि मेरे उत्तर में मैन्युअल के कई लिंक हैं। – Thomas

4

Emacs में, एक नेटवर्क कनेक्शन को एसिंक्रोनस उपप्रोसेस की तरह माना जाता है। इसलिए, subprocesses से आउटपुट भेजने या पढ़ने पर निर्देश भी यहां लागू होते हैं।

सर्वर पर कुछ भेजने के लिए, Input to Processes देखें, और परिणाम पढ़ने के लिए, Output from Processes देखें।

जानकारी स्ट्रिंग फॉर्म में नेटवर्क पर प्रेषित की जाती है, इसलिए आप सर्वर से डेटा प्राप्त करने के बाद read या read-from-string का उपयोग करना चाह सकते हैं। Input Functions देखें।

+0

आपके उत्तर ने पहले से ही महत्वपूर्ण जानकारी दी है: नेटवर्क कनेक्शन को एसिंक्रोनस उपप्रोसेसेस के रूप में देखें। तो मैं अधिक जानकारी के लिए Elisp मैनुअल पढ़ सकते हैं ... धन्यवाद। – Thorsten

संबंधित मुद्दे