2008-09-11 14 views
22

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

समस्या यह है कि मुझे पता नहीं है कि सर्वर के पक्ष में क्या किया जाना है।

मैं कल्पना कर सकता हूं कि मेरा आवेदन (क्यूटी का उपयोग कर सी ++ में विकसित) को सर्वर पर एक अनुरोध (HTTP?) भेजना है, लेकिन इस अनुरोध का जवाब क्या दे रहा है? फ़ायरवॉल से गुजरने के लिए, मुझे लगता है कि मुझे पोर्ट 80 का उपयोग करना होगा? क्या ये सही है ?

या, ऐसी सुविधा के लिए, क्या मुझे एक विशिष्ट पोर्ट नंबर खोलने के लिए हमारे नेटवर्क व्यवस्थापक से पूछना है जिसके माध्यम से मैं संवाद करूंगा?


@pilif: आपके विस्तृत उत्तर के लिए धन्यवाद।

तरह

http://www.example.com/update?version=1.2.4

तो फिर तुम लौट सकते हैं कि तुम क्या कभी आप चाहते, नए संस्करण के संस्थापक की शायद यह भी डाउनलोड यूआरएल: वहाँ अभी भी कुछ जो मेरे लिए स्पष्ट नहीं है है।

मैं कुछ कैसे वापस कर सकता हूं? क्या यह एक PHP या एएसपी पृष्ठ होगा (मुझे PHP और न ही एएसपी के बारे में कुछ भी पता है, मुझे कबूल करना है)? तदनुसार कुछ वापस करने के लिए मैं ?version=1.2.4 भाग को कैसे डीकोड कर सकता हूं?

उत्तर

38

मैं पूरी तरह से आपकी वेबसाइट पर एक सादा HTTP अनुरोध करने की अनुशंसा करता हूं। बाकी सब कुछ असफल होने के लिए बाध्य है।

मैं स्थानीय एप्लिकेशन के संस्करण वाली आपकी साइट पर एक निश्चित पृष्ठ पर एक HTTP GET अनुरोध कर दूंगा।

तरह

http://www.example.com/update?version=1.2.4 

तो फिर तुम तुम क्या कभी आप चाहते लौट सकते हैं, नए संस्करण के संस्थापक की शायद यह भी डाउनलोड यूआरएल।

क्यों न केवल सर्वर पर नवीनतम संस्करण के साथ एक स्थिर फ़ाइल डालें और ग्राहक को निर्णय लेने दें? क्योंकि आप प्रक्रिया पर नियंत्रण रखने के लिए (या आवश्यकता) चाहते हैं। हो सकता है कि 1.2 भविष्य में सर्वर के साथ संगत नहीं होगा, इसलिए आप चाहते हैं कि सर्वर 1.3 को अपडेट को मजबूर करे, लेकिन 1.2.4 से 1.2.6 तक का अपडेट अनैतिक हो सकता है, इसलिए आप क्लाइंट को पेश करना चाहेंगे एक वैकल्पिक अद्यतन।

या आप स्थापित आधार पर एक ब्रेकडाउन चाहते हैं।

या जो भी हो। आम तौर पर, मैंने सीखा है कि सर्वर पर ज्यादा बुद्धि रखने के लिए सबसे अच्छा है, क्योंकि सर्वर वह है जो आपके ऊपर परम नियंत्रण है।

क्षेत्र में अनुभव का एक सा के साथ यहाँ बात हो रही है, यहाँ क्या कर सकते हैं का एक छोटा सा पूर्वावलोकन है (और होगा - मुझ पर भरोसा) बिगड़ जाए:

  • आपका आवेदन द्वारा HTTP-अनुरोध बनाने से रोका जाएगा वहाँ विभिन्न व्यक्तिगत फ़ायरवॉल अनुप्रयोगों।
  • उपयोगकर्ताओं के एक बड़े प्रतिशत में वास्तव में अपडेट प्रक्रिया को प्राप्त करने के लिए आवश्यक अनुमतियां नहीं होंगी।
  • भले ही आपके उपयोगकर्ताओं ने अपने व्यक्तिगत फ़ायरवॉल से पुराने संस्करण की अनुमति दी हो, फिर भी उपकरण शिकायत करेगा क्योंकि .EXE बदल गया है और उपयोगकर्ता को यह सलाह देगा कि नए एक्सई को कनेक्ट करने की अनुमति न दें (उपयोगकर्ता आमतौर पर उनकी सुरक्षा की इच्छाओं का अनुपालन करते हैं उपकरण यहाँ)।
  • प्रबंधित वातावरण में, आपको वेब से निष्पादन योग्य सामग्री लोड करने और फिर वास्तव में इसे निष्पादित करने के लिए गोली मार दी जाएगी और लटका दिया जाएगा (उस क्रम में जरूरी नहीं)।

तो क्षति यथासंभव कम रखने के लिए,

  • चुपचाप असफल जब तुम,
  • अद्यतन करने से पहले अद्यतन सर्वर से कनेक्ट नहीं कर सकते हैं सुनिश्चित करें कि आप को लिखने अनुमति ले ली है निर्देशिका स्थापित करें और उपयोगकर्ता को चेतावनी दें यदि आप नहीं करते हैं, या बस बिल्कुल अपडेट नहीं करते हैं।
  • व्यवस्थापक के लिए स्वत: अद्यतन बंद करने का एक तरीका प्रदान करें।

ऐसा करने में कोई मजा नहीं है कि आप क्या करने जा रहे हैं - खासकर जब आप गैर तकनीकी रूप से इच्छुक उपयोगकर्ताओं के साथ सौदा करते हैं क्योंकि मुझे कई बार करना पड़ता है।

+3

बहुत पूरा जवाब; लेकिन मैं जोड़ना चाहता हूं: यदि संभव हो, तो HTTPS/SSL का उपयोग करें। यद्यपि यह यहां जरूरी नहीं हो सकता है: ऐसे 'हे, क्या कोई अपडेट है?' के लिए स्नीफिंग के आसपास कुछ टूल्स हैं? - प्रश्न और बस जवाब दे रहे हैं, हाँ, यहां है, कृपया मेरा कोड लें और इसे इंस्टॉल/निष्पादित करें। '... – osti

+3

एसएसएल का उपयोग करने से भी बेहतर है वास्तव में अपडेट बाइनरी पर हस्ताक्षर करना और इसके हस्ताक्षर की जांच करना है। एसएसएल केवल साबित करता है कि अद्यतन यूआरएल लोड किया गया था, जिसके लिए (कोई भी) प्रमाण पत्र जारी किया गया था। पूरी तरह से सहेजने के पक्ष में रहने के लिए, मैं अपनी सार्वजनिक कुंजी के साथ अद्यतन होने वाले ऐप को तैनात कर दूंगा, अपनी निजी कुंजी के साथ अपडेट पर हस्ताक्षर करूँगा और फिर अपडेट को जांचूंगा। – pilif

0

ऐसा करने का सबसे आसान तरीका libcurl जैसी लाइब्रेरी का उपयोग करके एक HTTP अनुरोध को आग लगाना है और इसे एक आईएनआई या एक्सएमएल फ़ाइल डाउनलोड करना है जिसमें ऑनलाइन संस्करण है और जहां एक नया संस्करण ऑनलाइन उपलब्ध होगा।

xml फ़ाइल को पार्स करने के बाद आप यह निर्धारित कर सकते हैं कि कोई नया संस्करण आवश्यक है और libcurl के साथ नया संस्करण डाउनलोड करें और इसे इंस्टॉल करें।

+0

क्यूटी में नेटवर्किंग मॉड्यूल हैं इसलिए अतिरिक्त अनुरोध लाइब्रेरी का उपयोग किए बिना HTTP अनुरोध को आसानी से क्यूटी में संभाला जा सकता है। –

0

बस अपने सर्वर पर नवीनतम संस्करण के संस्करण संख्या के साथ एक (एक्सएमएल) फ़ाइल डालें, और नए संस्करण को डाउनलोड करने के लिए एक यूआरएल डालें। आपका एप्लिकेशन एक्सएमएल फ़ाइल का अनुरोध कर सकता है, देखो कि संस्करण अपने आप से अलग है या नहीं और उसके अनुसार कार्रवाई करें।

0

मुझे लगता है कि सर्वर पर सरल XML फ़ाइल केवल संस्करणों की जांच के लिए पर्याप्त होगी।

आपको अपने सर्वर पर केवल एक FTP खाता चाहिए और सिस्टम बनाने के लिए एक नया संस्करण बनाने के बाद फ़ाइल को ftp के माध्यम से फ़ाइल भेजने में सक्षम है। वह बिल्ड सिस्टम भी आपकी वेबसाइट पर इंस्टॉलेशन फाइल/ज़िप डाल सकता है!

1

सर्वर पर आपके पास एक साधारण फ़ाइल "latestversion.txt" हो सकती है जिसमें नवीनतम संस्करण का संस्करण संख्या (और शायद डाउनलोड यूआरएल) हो। क्लाइंट को http://your.web.site/latestversion.txt पुनर्प्राप्त करने के लिए बस एक सरल HTTP अनुरोध (हाँ, पोर्ट 80 पर) का उपयोग करके इस फ़ाइल को पढ़ने की आवश्यकता है, जिसे आप संस्करण संख्या प्राप्त करने के लिए पार्स कर सकते हैं। इस तरह आपको किसी भी फैंसी सर्वर कोड की आवश्यकता नहीं है --- आपको बस अपनी मौजूदा वेबसाइट पर एक साधारण फ़ाइल जोड़ने की आवश्यकता है।

0

यदि आप इसे वास्तव में बुनियादी रखना चाहते हैं, तो बस एक weberver पर एक संस्करण.txt अपलोड करें, जिसमें एक पूर्णांक संस्करण संख्या है। डाउनलोड किए गए नवीनतम संस्करण.txt के खिलाफ उस चेक को डाउनलोड करें और फिर बस एमएसआई या सेटअप पैकेज डाउनलोड करें और इसे चलाएं।

अधिक उन्नत संस्करण आरएसएस, एक्सएमएल या इसी तरह का उपयोग करना होगा। आरएसएस को पार्स करने के लिए किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करना सबसे अच्छा होगा और यदि आप ऐसा करना चाहते हैं तो आप अपने उपयोगकर्ता को परिवर्तनों के बारे में जानकारी शामिल कर सकते हैं।

असल में आपको बस सरल डाउनलोड कार्यक्षमता की आवश्यकता है।

इन दोनों समाधानों के लिए आपको केवल क्लाइंट साइड से पोर्ट 80 आउटगोइंग तक पहुंचने की आवश्यकता होगी। इसे सामान्य रूप से फ़ायरवॉल या नेटवर्किंग (क्लाइंट साइड पर) में किसी भी बदलाव की आवश्यकता नहीं होती है और आपको बस इंटरनेट का सामना करने वाला इंटरनेट सर्वर (वेब ​​होस्टिंग, कॉलोकेशन या अपना स्वयं का सर्वर) होना चाहिए - सभी यहां काम करेंगे)।

कुछ वाणिज्यिक ऑटो-अपडेट समाधान उपलब्ध हैं। मैं दूसरों के जवाब देने वालों के लिए सिफारिशें छोड़ दूंगा, क्योंकि मेरे पास केवल क्लिक-वन और अपडेटर एप्लिकेशन ब्लॉक के साथ नेट की ओर अनुभव है (बाद वाला कोई और जारी नहीं है)।

21

Pilif जवाब अच्छा था, और मैं भी इस के साथ अनुभव के बहुत सारे है, लेकिन मैं कुछ और जोड़ना चाहते हैं:

याद रखें कि यदि आप yourapp.exe शुरू करते हैं, तो "अपडेटर" करने की कोशिश करेंगे नवीनतम संस्करण के साथ yourapp.exe को ओवरराइट करें। आपके ऑपरेटिंग सिस्टम और प्रोग्रामिंग पर्यावरण के आधार पर (आपने सी ++/क्यूटी का उल्लेख किया है, मुझे उनके साथ कोई अनुभव नहीं है), आप yourapp.exe को ओवरराइट करने में सक्षम होंगे क्योंकि यह उपयोग में होगा।

मैंने जो किया है वह एक लॉन्चर बना रहा है। मेरे पास एक MyAppLauncher.exe है जो "असली exe" लॉन्च करने के लिए कॉन्फ़िगरेशन फ़ाइल (xml, बहुत सरल) का उपयोग करता है। एक नया संस्करण मौजूद होना चाहिए, लॉन्चर "असली exe" अपडेट कर सकता है क्योंकि यह उपयोग में नहीं है, और फिर नया संस्करण पुनः लॉन्च करता है।

बस इसे ध्यान में रखें और आप सुरक्षित रहेंगे।

7

मार्टिन,

आप बिल्कुल सही हैं। लेकिन मैं लॉन्चर को इंस्टॉलर के साथ पहुंचा दूंगा। या बस इंस्टॉलर डाउनलोड करें, इसे लॉन्च करें और जितनी जल्दी हो सके खुद को छोड़ दें। लॉन्चर में बग कारण है। आप कभी भी ऐसे घटक पर निर्भर नहीं रहना चाहते हैं जिसे आप अपडेट नहीं कर सकते (या प्रारंभिक बूंद में शामिल करना भूल जाते हैं)।

तो मेरे आवेदन की अद्यतन प्रक्रिया के साथ वितरित पेलोड केवल मानक इंस्टॉलर है, लेकिन किसी भी महत्वपूर्ण यूआई से रहित है। एक बार क्लाइंट ने जांच कर ली है कि इंस्टॉलर को सफलतापूर्वक चलाने का मौका मिला है और एक बार यह अद्यतनकर्ता डाउनलोड करने के बाद, यह चलता है और खुद को छोड़ देता है।

रनों की तुलना में अद्यतनकर्ता, मूल स्थापना निर्देशिका में अपना पेलोड इंस्टॉल करता है और (उम्मीदपूर्वक अद्यतन) एप्लिकेशन को पुनरारंभ करता है।

फिर भी: प्रक्रिया बालों वाली है और जब आप अपने अनुप्रयोग का व्यापक उपयोग करते हैं तो विंडोज प्लेटफॉर्म पर ऑटो अपडेट कार्यक्षमता को लागू करने से पहले बेहतर सोचते हैं।

+0

सहमत! हम इंटरनेट के माध्यम से अद्यतन नहीं करते हैं। हमारा "लॉन्चर" केवल एक प्रक्रिया को चलाता है, अद्यतन कोड ऐप में है। किसी भी मामले में, उपयोगकर्ता इसे स्वचालित रूप से कभी नहीं करता है, हम इसे वीएनसी के माध्यम से करते हैं क्योंकि यह एक मेडिकल डीबी है और डीबी स्क्रिप्ट चलाने के मामले में हम डीबी को जोखिम नहीं लेना चाहते हैं। अच्छा –

2

मैं @ मार्टिन और @ पिलिफ़ के उत्तर से सहमत हूं, लेकिन जोड़ें;

अपने अंतिम उपयोगकर्ताओं को यह तय करने की अनुमति दें कि वे वास्तव में वहां अद्यतन स्थापित करना चाहते हैं या फिर, जब तक वे प्रोग्राम का उपयोग समाप्त नहीं कर लेते हैं, तब तक अद्यतन की स्थापना में देरी हो जाती है।

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

हमारे पास लगभग 400 दुकानों में एक ईपीओएस सिस्टम चल रहा था, और शुरुआत में हमने सोचा था कि प्रोग्राम स्पॉट अपडेट होना और उन्हें डाउनलोड करना बहुत अच्छा होगा (एक संस्करण का उपयोग करके संस्करण संख्या जिसमें आपके ऊपर दिए गए सुझावों के समान ही है)। .. महान विचार। जब तक सभी दुकानों ने एक ही समय में अपने सिस्टम शुरू नहीं किए (8: 45-8: 50am), और हमारा सर्वर 400 रिमोट सर्वर पर 20 + एमबी डाउनलोड की सेवा कर रहा था, जो तब स्थानीय सॉफ़्टवेयर को अपडेट करेगा और एक कारण होगा पुनः आरंभ करें। कैओस - कोई भी लगभग 10 मिनट तक व्यापार करने में सक्षम नहीं है।

जरूरत नहीं है कि इस वजह से हमें बाद में बंद कर देते हैं तो 'अद्यतन के लिए जाँच' और यह नया स्वरूप की दुकानों में 'देरी' दिन में बाद में जब तक अद्यतन अनुमति देने के लिए करने के लिए कहने के लिए। :-)

संपादित करें: और यदि एडीओबीई से कोई भी पढ़ रहा है - भगवान के लिए क्यों डर है एक्रोबैट रीडर अपडेट और बकवास डाउनलोड करने का प्रयास करता है जब मैं सिर्फ एक दस्तावेज़ पढ़ने के लिए आग लगाना चाहता हूं? क्या यह शुरू करने में पर्याप्त धीमा नहीं है, और पर्याप्त रूप से फुलाया गया है, जैसा कि है, हर बार जब मैं पीडीएफ पढ़ना चाहता हूं तो अपडेट के लिए मेरे जीवन के 20-30 सेकंड बर्बाद किए बिना?
क्या वे अपने स्वयं के सॉफ़्टवेयर का उपयोग नहीं करते हैं ?? !!!

+0

एलओएल, अच्छी तरह से हम स्वत: अद्यतन नहीं करते हैं। उपयोगकर्ता कभी भी autoupdates। हम करते हैं :) हमारे उपयोगकर्ता के डीबी में बहुत महत्वपूर्ण चिकित्सा डेटा होता है, हम क्या करते हैं हम सर्वर को अपडेट करते हैं (इन-हाउस विज़ार्ड का उपयोग करके) जो डीबी बैकअप करता है और स्क्रिप्ट निष्पादित करता है और फिर यदि सब कुछ ठीक है, तो यह "प्रकाशित" होता है updat –

2

:-) यदि आप example.com पर अद्यतन निर्देशिका में अपनी फ़ाइलें रखने के लिए, इस PHP स्क्रिप्ट उनके लिए आप अनुरोध जैसा कि पहले उल्लेख दिए गए डाउनलोड करना चाहिए। । (अपने अद्यतन yourprogram.1.2.4.exe किया जाएगा

$version = $_GET['version'];  
$filename = "yourprogram" . $version . ".exe"; 
$filesize = filesize($filename); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: post-check=0, pre-check=0"); 
header("Content-type: application-download"); 
header('Content-Length: ' . $filesize); 
header('Content-Disposition: attachment; filename="' . basename($filename).'"'); 
header("Content-Transfer-Encoding: binary"); 

यह बनाता है अपने वेब ब्राउज़र लगता है कि यह एक आवेदन को डाउनलोड कर रहा है

5
php में

, बात करना आसान है:

<?php 
    if (version_compare($_GET['version'], "1.4.0") < 0){ 
     echo "http://www.example.com/update.exe"; 
    }else{ 
     echo "no update"; 
    } 
?> 

अगर बेशक आप यह इतना विस्तार कर सकता है स्क्रिप्ट के अंदर वर्तमान में उपलब्ध संस्करण नहीं हार्ड-कोडेड है, लेकिन यह सिर्फ बिंदु illustrating के बारे में है।

अपने आवेदन में आप हा होगा

result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion()); 
if result != "no update" then 
    updater = downloadUpdater(result); 
    ShellExecute(updater); 
    ExitApplication; 
end; 

कुछ PHP स्क्रिप्ट है कि क्या यह एक महत्वपूर्ण, अनिवार्य अद्यतन है या नहीं ग्राहक बताने के लिए लौट सकते हैं निर्दिष्ट करके "प्रोटोकॉल" का विस्तार करने के लिए स्वतंत्र महसूस: इस छद्म कोड किया है।

या आप उपयोगकर्ता के लिए प्रदर्शित करने के लिए कुछ पाठ जोड़ सकते हैं - हो सकता है क्या परिवर्तन हुए हैं के बारे में कुछ जानकारी युक्त।

आपकी संभावनाएं काफी असीमित हैं।

4

मेरे क्यूटी एप्लिकेशन सिर्फ अपनी वेबसाइट है कि नवीनतम संस्करण संख्या में शामिल बंद छोटे एक्सएमएल फ़ाइल को पढ़ने के लिए QHttp उपयोग करता है। यदि यह वर्तमान संस्करण संख्या से अधिक है तो यह डाउनलोड पेज पर जाने का विकल्प देता है। बहुत आसान। ठीक काम करता है।