2012-03-29 21 views
9

स्कैला सीखने में लोगों की सहायता के लिए एक सामुदायिक संसाधन के रूप में लक्षित एक छोटी शैक्षिक परियोजना के लिए मैं पृष्ठभूमि धागे में वेब पृष्ठों की सेवा और प्रक्रिया करने का एक आसान तरीका ढूंढ रहा हूं।स्कैला: स्कैला ऐप में एक छोटा वेब सर्वर कैसे एम्बेड करें?

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

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

आवश्यकताएं बहुत बुनियादी हैं: शुरुआत में मैं एक संपादन बॉक्स के साथ एक पृष्ठ की सेवा करने और "गो" बटन (= सर्वर पर अपलोड, संकलित & खेल में प्रकाशित) पर विचार करता हूं; मैं 20 से अधिक समवर्ती उपयोगकर्ताओं की अपेक्षा करता हूं जिनमें हर 5 या 10 सेकंड में सभी उपयोगकर्ताओं में एक से अधिक बॉट अपलोड नहीं होते हैं; मुझे प्रत्येक उपयोगकर्ता (केवल एक नाम) के लिए न्यूनतम स्थिति रखने की आवश्यकता है और मुझे उपयोगकर्ता को कंपाइलर त्रुटि संदेश वापस करने की आवश्यकता है। ध्यान दें कि गेम स्क्रीन अपडेट ब्राउज़र में प्रदर्शित नहीं होंगे बल्कि सर्वर मशीन से जुड़े प्रोजेक्टर पर प्रदर्शित नहीं होंगे। और मुख्य रूप से सबसे सरल संभव सेटअप (गेम सर्वर .jar पर डबल क्लिक) की अनुमति देने के लिए मुझे लगता है कि मौजूदा सर्वर सर्वर के भीतर पृष्ठभूमि सर्वर में वेब सर्वर को चलाने के लिए अच्छा लगेगा।

ऐसा करने का सबसे उचित तरीका क्या है? क्या मुझे कुछ मौजूदा ढांचे का उपयोग करना चाहिए, जैसे प्ले या लिफ्ट? क्या ऐसा कुछ करने के लिए मौजूदा कोड है? क्या इस तरह के पृष्ठभूमि धागे में वेब सर्वर चलाने की योजना बनाना भी उचित है? किसी भी सलाह की सराहना की है।

उत्तर

2

जावा दुनिया में सबसे अधिक उपयोग किए जाने वाले छोटे, एम्बेड करने योग्य वेब सर्वर/सर्वलेट कंटेनर में से एक Jetty है। चूंकि स्कैला आसानी से जावा पुस्तकालयों का उपयोग कर सकता है, इसलिए इसे स्कैला से उपयोग करना आसान होना चाहिए।

This page एम्बेडेड HTTP सर्वर के रूप में इसे प्रारंभ करने के तरीके पर कुछ सरल उदाहरण (जावा में) दिखाता है।

+0

बढ़िया है, कि बाहर की जाँच करेगा, धन्यवाद! –

+0

मुझे जेटी के साथ सब कुछ मिल गया। पारितोषिक के लिए धन्यवाद। –

0

जैसा कि आप एक ढांचा प्रदान करना चाहते हैं, मुझे लगता है कि सबसे अच्छा समाधान मौजूदा ढांचे का उपयोग करना है, इस तरह आपको फिर से आविष्कार करने वाली चीजों से परेशान नहीं होना पड़ेगा।

मेरे व्यक्तिगत अनुभव से, जो वास्तव में व्यक्तिपरक है, मैं आपको लिफ्ट का उपयोग करने का सुझाव दूंगा क्योंकि मुझे पता है कि यह सत्र, वैश्विक स्निपेट और अन्य सामानों के समर्थन के लिए बहुत शक्तिशाली है। आप शास्त्रीय chat app का विस्तार करने का प्रयास कर सकते हैं जिसका प्रयोग लिफ्ट कैसे काम करता है, उदाहरण के लिए प्रयोग किया जाता है, यह आपके उपयोग के लिए उपयोगी है या लंबे समय तक नहीं होना चाहिए।

+0

ठीक है, धन्यवाद, मैं इसे देख लूंगा। –

3

Embedding Jetty जेटी प्रोजेक्ट के प्राथमिक लक्ष्यों में से एक होने के नाते काफी आसान है। यदि आपको जरूरत है तो सरल हैं, यह सबसे तेज़ मार्ग है। मुझे संदेह है कि आपको जल्दी से अधिक मजबूत समाधान (मॉडल, रूटिंग, टेम्पलेट्स इत्यादि) की आवश्यकता होगी ताकि Lift या Play Framework जैसे ढांचे का उपयोग करना बेहतर विचार होगा।

10

एंबेडेड वेब सर्वर बिल्कुल Unfiltered के लिए बनाया गया था। Unfiltered के लिए मूल दर्शन यह है कि वेब सर्वर केवल एक पुस्तकालय है जिसे आप अपने कोड से कॉल करते हैं, इसके बजाय आपके कोड को वेब फ्रेमवर्क कॉल करने की बजाय।

+0

धन्यवाद, यह बहुत अच्छा लगता है। मुझे इसे देखना होगा। –

+0

यह सही है, इच्छा है कि मैं एक अतिरिक्त अपवर्त दे सकता हूं। मुझे ** स्काला सीखने के लिए ** एक परियोजना का उपयोग करना है। – aitchnyu

+0

बहुत छोटे उपयोग के मामले के लिए मुझे हल्के से घोंसले 'अगर' से बचने के लिए जरूरी की तुलना में अधिक जटिलता की तरह लग रहा था, क्योंकि मुझे जेटी या किसी भी तरह की आवश्यकता होगी। जेटी एकीकृत और लगभग एक घंटे में काम कर रहा है। हो सकता है कि जब चीजें अधिक शामिल हों तो अनफिल्टर भुगतान करेगा। –

1

यहाँ जावा कंटेनर और स्काला चौखटे embedding के विभिन्न उदाहरण के एक जोड़े हैं:

जबकि Heroku पर आवेदन चलाने के बारे में इन बात के दोनों, आप कर सकते हैं बस उन्हें स्कैला अनुप्रयोग स्टैंडअलोन के रूप में चलाएं।

1
val webServer = new Thread("Web Server") { 
    def response(text: String, code: String = "200 OK") = 
    """HTTP/1.0 """ + code + """ 
    Content-Type: text/html 
    Content-Length: """ + text.length + """ 

    """ + text 

    override def run { 
    for(port <- env.webPort) { 
     val ss = new ServerSocket(port) 
     while (true) try { 
     val s = ss.accept 
     try { s.getOutputStream.write(response(someStuff.toString).getBytes) 
     } finally { s.close } 
     } catch { case ie: InterruptedException => return } 
    } 
    } 
} 

भी देखें scala kittens