سؤال

لقد أنشأت خادم Java ، الذي يأخذ لقطات الشاشة ، وينزولها ، ويرسلها عبر TCP/IP إلى تطبيق iPhone الخاص بي. يستخدم التطبيق بعد ذلك nsinputStream لجمع بيانات الصورة الواردة ، وإنشاء مثيل NSMutabledata مع المخزن المؤقت للبايت ، ثم قم بإنشاء كائن Uiimage لعرضه على iPhone. لقطة الشاشة ، بشكل أساسي. رمز iPhone الخاص بي لجمع بيانات الصورة حاليًا كما يلي:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{


if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){
        uint8_t buffer[1024];

    while([iStream hasBytesAvailable]){
        NSLog(@"New Data");

        int len = [iStream read:buffer maxLength:sizeof(buffer)];

        [imgdata appendBytes:buffer length:len];
        fullen=fullen+len;

        /*Here is where the problem lies.  What should be in this
         if statement in order to make it test the last byte of
         the incoming buffer, to tell if it is the End of Image marker
         for the end of incoming JPEG file?
         */
        if(buffer[len]=='FFD9'){
        UIImage *img = [[UIImage alloc] initWithData:imgdata];
        NSLog(@"NUMBER OF BYTES: %u", len);

        image.image = img;
        }
    }

}
}

مشكلتي ، كما هو موضح في التعليق داخل الرمز ، هي اكتشاف وقت التوقف عن جمع البيانات في كائن NSMutabledata ، واستخدام البيانات لإنشاء uiimage. يبدو أنه من المنطقي البحث عن نهاية JPEG لعلامة الملفات-علامة الصورة (EOI) (FFD9)-في البايتات الواردة ، حيث ستكون الصورة جاهزة للعرض عند إرسال ذلك. كيف يمكنني اختبار هذا؟ إما أن أفتقد شيئًا عن كيفية تخزين البيانات ، أو حول العلامة داخل ملف JPEG ، ولكن أي مساعدة في اختبار هذا سيكون موضع تقدير كبير!

جوامع

هل كانت مفيدة؟

المحلول

من الواضح أنك لا تريد إغلاق الدفق لأن ذلك سيقتل الأداء.

نظرًا لأنك تتحكم في اتصال خادم العميل ، فأرسل رقم # Bytes في الصورة قبل إرسال بيانات الصورة. والأفضل من ذلك ، إرسال # بايت في الصورة ، وبيانات الصورة ، وسلسلة # في النهاية حتى تتمكن من التحقق بسرعة من وصول البيانات بالفعل.

أسهل بكثير وأكثر كفاءة من التحقق فعليًا لنهاية علامة الملف. على الرغم من ذلك ، بالطبع ، يمكنك أيضًا التحقق من ذلك بعد استلام رقم البايتات أيضًا. سهل بما فيه الكفاية.

بطبيعة الحال ، سيكون كل هذا غير فعال بشكل كبير لأغراض نمط الشاشة في جميع الحالات غير العادية. في معظم الحالات ، يتغير جزء صغير فقط من الشاشة التي سيتم عكسها فعليًا مع كل إطار. إذا حاولت إرسال الشاشة بأكملها مع كل إطار ، فسوف تشبع اتصالك بسرعة وسيكون جانب العميل متأخراً بشكل فظيع وغير مستجيب.

بالنظر إلى أن هذا سوق ناضج للغاية ، فهناك الكثير من الحلول وعدد قليل من البتات مفتوحة المصدر التي يمكنك من خلالها استخلاص حل لتناسب احتياجاتك (انظر VNC ، على سبيل المثال).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top