2016-04-09 8 views
7

मुझे एक रिमोट सर्वर को एसिंक्रोनस सॉकेट कनेक्शन और रीटिव डेटा से कनेक्ट करना होगा। मैं कनेक्ट कर सकता हूं लेकिन एक समस्या है।असीमित सॉकेट क्लाइंट बफर आकार

पैकेज टुकड़े भेज रहे हैं। मेरे पास दो विकल्प हैं; मैं एक बफर सेट कर सकता हूं और पूरे पैकेज को एक टुकड़े में प्राप्त कर सकता हूं या सभी स्थानांतरण किए जाने पर टुकड़ों को जोड़ सकता हूं। मुझे लगता है कि पहला विकल्प (बफर चीज) सही तरीका है।

मैं एक बफर आकार परिभाषित कर रहा हूं लेकिन यह पहले भाग में काम नहीं कर रहा है। अन्य भागों में, यह काम करता है लेकिन इस विधि के साथ मैं एक टुकड़े में पूरा पैकेज नहीं प्राप्त कर सकता क्योंकि पहला भाग 5,24 Kb के साथ सीमित है।

आप पा सकते हैं नीचे मेरी कोड:

$loop = React\EventLoop\Factory::create(); 

     $dnsResolverFactory = new React\Dns\Resolver\Factory(); 
     $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop); 
     $connector = new React\SocketClient\Connector($loop, $dns); 
     $connector->create(ENDPOINT_IP , ENDPOINT_PORT)->then(function (React\Stream\Stream $stream) use ($loop) { 

      $command = '{C:"EL",bmId:43,inst:"my_instance",tok:"my_token"}'; 

      $command_length = strlen($command); 
      $command_length = pack("N", $command_length); 

      $stream->write($command_length); 
      $stream->write($command); 

      $stream->bufferSize = 999999; 
      $stream->on('data', function ($data) { 

      $package = substr($data, 0, 4); 
      $unpack  = unpack('N', $package); // I'm getting whole package size 

      echo $data; 



      }); 


     }); 

     $loop->run(); 

मैं $stream->on('data', function ($data) { रेखा के नीचे एक बफर आकार को परिभाषित करने की कोशिश की, लेकिन जैसा कि आप अनुमान लगा यह विफल रहा है। मुझे नहीं पता कि इसे सही तरीके से कैसे संभाला जाए।

अग्रिम धन्यवाद।

उत्तर

4

"मैं एक बफर सेट कर सकता हूं और एक टुकड़ा में पूरा पैकेज प्राप्त कर सकता हूं या सभी स्थानांतरण किए जाने पर टुकड़ों को जोड़ सकता हूं। मुझे लगता है कि पहला विकल्प (बफर चीज) सही तरीका है।"

पहला विकल्प सही तरीके से नहीं है क्योंकि यह सॉकेट संचार काम करने का तरीका नहीं है।

यदि आप प्राप्त कर रहे हैं, उदाहरण के लिए, 5 केबी डेटा और आप अपने बफर को काफी बड़ा सेट करते हैं, तो हम 10 केबी कहते हैं, आप उम्मीद नहीं कर सकते कि एक कॉल में $stream->on('data', function ($data) { ... आपको सभी 5 केबी प्राप्त होंगे।

आप चाहिए तीन बातें करते हैं:

  • आप डेटा आप एक संदेश ब्लॉक में प्राप्त कर रहे हैं की सटीक आकार पता करने की जरूरत। या तो आप जानते हैं कि संदेश हमेशा तय और ज्ञात आकार होगा, या डेटा ब्लॉक में एक शीर्षलेख है जिससे संदेश की लंबाई पढ़ी जा सकती है। आपके मामले में आप प्राप्त डेटा के पहले 4 बाइट्स से संदेश आकार पढ़ रहे हैं।
  • लूप में आपको सर्वर से आने वाले डेटा हिस्सों को पढ़ने की आवश्यकता है और उन्हें को संयोजित करें जब तक कि आपके पास पूरे संदेश के आकार को पढ़ने के लिए पर्याप्त बाइट्स न हों। आपके मामले में यह 4 बाइट्स है। हालांकि यह अजीब लगता है, एक संभावना है कि आपको दो हिस्सों में 1 और फिर 3 बाइट प्राप्त हों, दो कॉल में $stream->on('data', function ($data) { ... पर। जब समेकित डेटा का आकार >=4 है तो आप संदेश का आकार पढ़ते हैं।
  • उसी लूप में, आपको सॉकेट से आने वाले डेटा हिस्सों को पढ़ना जारी रखना होगा और जब तक आप सभी संदेश बाइट प्राप्त नहीं करेंगे तब तक उन्हें संयोजित करना होगा। बेशक, इसका मतलब है कि आपको उस लूप के बाहर एक चर परिभाषित करने की आवश्यकता है जिसमें आप प्राप्त डेटा संग्रहीत करेंगे। पूरा संदेश प्राप्त करने के बाद आपको लूप से बाहर निकलने की आवश्यकता है।

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

+0

दरअसल मैंने आपके सुझावों सहित कई चीजों को आजमाया लेकिन परिणाम समान है। –

+0

एचएम, आपने यह नहीं बताया है कि आपके पास क्या सटीक समस्या है। कृपया परिणाम के रूप में आपको जो भी मिलता है उसे पोस्ट करें और क्या अपेक्षित है। यदि आप एक प्रतिक्रिया में से एक से अधिक पैकेज प्राप्त कर रहे हैं, तो आपको अतिरिक्त तर्क होना चाहिए। जब एक पैकेज के लिए सभी डेटा आम तौर पर पहुंचे हैं तो आपको उसी प्रतिक्रिया में अगले पैकेज का हिस्सा मिल जाएगा। डेटा को शुरू करने के रूप में आपको अगली पुनरावृत्ति में सहेजने और उपयोग करने के लिए आवश्यक अतिरिक्त डेटा। – BJovke

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