2009-07-13 12 views
14

के साथ लंबे मतदान के साथ मैं एक आईफोन एप्लिकेशन पर काम कर रहा हूं जो सर्वर से सर्वर पर सर्वर से ईवेंट अधिसूचनाएं भेजने के लिए लंबी-मतदान का उपयोग करेगा। सर्वर पर कनेक्शन खोलने के बाद मैं जेएसओएन के छोटे बिट्स भेज रहा हूं जो घटनाओं का प्रतिनिधित्व करते हैं, जैसा कि वे होते हैं। मुझे लगता है कि NSURLRequest बनाने के दौरान उपयोग किए जाने वाले कैश सेटिंग्स के बावजूद, मैं कनेक्शन बंद करने के बाद -[NSURLConnectionDelegate connection:didReceiveData] को कॉल नहीं कर रहा हूं। मैंने सत्यापित किया है कि सर्वर अंत अपेक्षित के रूप में काम कर रहा है - पहला JSON ईवेंट तुरंत भेजा जाएगा, और बाद की घटनाओं को वायर पर भेजे जाने पर भेजा जाएगा। क्या इन घटनाओं को प्राप्त करने के लिए NSURLConnection का उपयोग करने का कोई तरीका है, या मुझे इसके बजाय CFSocket API पर जाने की आवश्यकता होगी?NSURLConnection

मैं CocoaAsyncSocket को एकीकृत करने पर काम करना शुरू कर रहा हूं, लेकिन यदि संभव हो तो NSURLConnection का उपयोग करना जारी रखना पसंद करेंगे क्योंकि यह मेरे बाकी आरईएसटी/जेएसओएन-आधारित वेब सेवा संरचना के साथ बेहतर है।

+0

अरे, मैंने देखा कि आप इच्छित परिणाम प्राप्त करने के लिए asyncsocket इस्तेमाल किया। किसी भी मौके पर मैं इस बारे में अपने दिमाग को चुन सकता हूं? मैं ट्विटर पर @suprfrends हूँ। इसकी बहुत सराहना की जाएगी! –

+0

मैं यह पता लगा पा रहा था .... की जाँच: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

+0

मैं एक पाया http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

उत्तर

7

NSURLConnection डेटा डाउनलोड करते समय डेटा को बफर करेगा और इसे didReceiveData विधि के साथ एक खंड में वापस कर देगा। NSURLConnection कक्षा नेटवर्क अंतराल और डेटा में एक जानबूझकर विभाजन के बीच अंतर नहीं बता सकती है।

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

+1

यही वह है जिसे मैं डरता था। मुझे लगता है कि मैं खुद को CFSocket से निपटने के बजाय CocoaAsyncSocket के साथ जाऊंगा। – pix0r

+0

रिकॉर्ड के लिए, CocoaAsyncSocket बहुत अच्छा काम कर रहा है, हालांकि सब कुछ ठीक से काम करने के लिए एक अतिरिक्त घंटे या दो लिया। – pix0r

+0

खुशी है कि यह अंत में काम किया! –

0

ऐसा लगता है जैसे आपको सर्वर-साइड पर सॉकेट फ्लश करने की आवश्यकता है, हालांकि यह निश्चित रूप से कहना मुश्किल है। यदि आप सर्वर को ऐसा करने के लिए आसानी से नहीं बदल सकते हैं, तो यह सर्वर कनेक्शन को वास्तव में सर्वर से भेजे जाने पर देखने के लिए नेटवर्क कनेक्शन को स्नीफ करने में मदद कर सकता है।

आप अपने नेटवर्क को स्नीफ करने के लिए वायरसहार्क जैसे टूल का उपयोग कर सकते हैं।

क्या भेजा रही है देखने के लिए एक अन्य विकल्प/प्राप्त करने के लिए/फोन निम्न आलेख में वर्णन किया गया से:

http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/

गुड लक!

+0

मैं टेलनेट के माध्यम से कनेक्ट कर सकता हूं और सत्यापित करें कि डेटा अपेक्षित रूप से नीचे आ रहा है, जैसा कि अपेक्षित है। ऐसा लगता है जैसे मैट का उल्लेख करते हुए NSURLConnection हमेशा डेटा को बफर करता है। – pix0r

0

हम वर्तमान में आईफोन में हमारे स्ट्रीमलिंक धूमकेतु पुस्तकालयों को पोर्ट करने के लिए कुछ आर & डी कर रहे हैं।

मुझे पता चला है कि एमुलेटर में आप 1kB डेटा प्राप्त होने के बाद रिसीवडेटा कॉलबैक प्राप्त करना शुरू कर देंगे। तो आप कॉलबैक प्राप्त करने के लिए एक जंक 1 केबी ब्लॉक भेज सकते हैं। ऐसा लगता है कि डिवाइस पर, हालांकि, ऐसा नहीं होता है। सफारी (डिवाइस पर) में आपको 2 केबी भेजना होगा, लेकिन NSURLConnection I का उपयोग करके मुझे भी कोई कॉलबैक नहीं मिल रहा है। ऐसा लगता है कि मुझे एक ही दृष्टिकोण लेना पड़ सकता है।

मैं मल्टीपार्ट-प्रतिस्थापन और कुछ अन्य उपन्यास शीर्षलेखों और माइम प्रकारों के साथ भी खेल सकता हूं यह देखने के लिए कि क्या यह NSURLConnection को प्रोत्साहित करने में मदद करता है।

+0

मैं वास्तव में CocoaAsyncSocket का उपयोग करने की अनुशंसा करता हूं - यदि आपको आवश्यकता हो तो मूल HTTP आदेशों को लागू करने के लिए यह काफी आसान है। कौन जानता है कि ऐप्पल भविष्य में NSURLConnection कैसे बदल सकता है ... – pix0r

0

एक और HTTP एपीआई ASIHttpRequest नामित कार्यान्वयन नहीं है। इसमें ऊपर बताई गई समस्या नहीं है और फ़ाइल अपलोड, कुकीज़, प्रमाणीकरण, सहित लगभग हर HTTP सुविधा के लिए एक पूर्ण टूलकिट प्रदान करता है ...

http://allseeing-i.com/ASIHTTPRequest/

+0

और इसे स्वयं रोल करने के विपरीत ASIHttpRequest HTTP प्रॉक्सी, प्रमाणीकरण इत्यादि को संभालने के लिए प्रतीत होता है, यदि आप तय करते हैं कि "अरे, यह सिर्फ एक सॉकेट कनेक्शन है और कुछ भेज रहा है हेडर, यह कितना मुश्किल हो सकता है? " :) टीसीपी या यूडीपी पर सीओएमईटी का उपयोग करने के मुख्य कारणों में से एक यह है कि यह फासीवादी कॉर्पोरेट फ़ायरवॉल के माध्यम से जाता है। –