الحصول على رسائل iPhone / iPod من خادم C # Tcpip باستخدام CocoAasyNcSocket

StackOverflow https://stackoverflow.com/questions/798408

  •  18-09-2019
  •  | 
  •  

سؤال

أحاول إرسال / تلقي البيانات عبر واي فاي إلى تطبيق iPhone / iPodtouch من خادم C # Tcpip. لهذا اعتدت cocoaasyncsocket من مشروع Google. إذا قمت بضغط زر وأرسل طلبا من iPod إلى الخادم، فهو بإرجاع البيانات المطلوبة (عنوان الأغنية على سبيل المثال) .. أريد أن أعرف كل ثانية ما هي الأغنية التي تلعبها ... حتى من خادم C # أرسل على فترات من 1 الرسائل الثانية إلى تطبيقي. في تطبيقي في جهاز توقيت مع الفاصل الزمني ل 1 ثانية أسمي Asyncsocket قراءة طريقة ReadDatawithTimeout. مشكلتي هي أنه بعد 8-9 ثوان هذه الطريقة لا تسمى بعد الآن. لا يزال الاتصال بالخادم نشطا ولا يزال خادم C # يرسل البيانات ..

ما أريد القيام به هو الشيء التالي: -> Winamp يلعب أغنية -> C # Server يسأل Winamp ما الأغاني التي يلعبها وترسل عنوان الأغنية إلى تطبيقي. -> تطبيق iPhone يتلقى البيانات ويعرضه

لا أعرف لماذا لا يسمى طريقة ReadDataWithTimeout بعد الآن بعد فترة زمنية قصيرة .. Maybe لأن الوقت القصير بين الرسائل المرسلة بواسطة خادم C #؟

شكرا لك يا سورين

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

المحلول 2

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

- (void) readDataFromSocket
{
        [socket readDataWithTimeout:-1 tag:0];
}

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding] autorelease];
    if(msg)
    {
        if([msg isEqualToString:@"something"])
        {
            Do stuff
        }
        else
        {
            Do something else
            }
        }
    }
    else
    {
        NSLog(@"Error converting received data into UTF-8 String");
    }
    [socket readDataWithTimeout:-1 tag:0];
}

أدعو مرة واحدة في تطبيقي طريقة ReadDatafromSocket التي تسمعي مآخذ التوصيل [مقبس ReadDataWithTimeout: -1 Tag: 0] الطريقة. يجب أن يطلق عليه مرة واحدة فقط في التطبيق لأنه في الطريقة - (الفراغ) Onsocket: (Asyncsocket *) Sock DidReadData: (NSDATA *) Data Withtag: (Long) طريقة العلامة في السطر الأخير أسميها مرة أخرى، -1 العلامة: 0]؛ الذي يروي المقبس للاستماع على المقبس. عندما تصل البيانات، سيقرأ المقبس.

آمل أن يساعد شخصا ما ..

نصائح أخرى

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

لذلك إذا فهمت بشكل صحيح، يتصل iPhone ب .NET ويسأل عن الأغنية. إرجاع .NET الأغنية وأوراق المقبس مفتوحة. كل ثانية، يكتب .NET إلى مقبسه، وكل فون ثاني يقرأ من مقبسه.

ما أظن أن يحدث هو أنه في مرحلة ما هي المهلة على readDataWithTimeout:tag: لا تنتهي قبل حرائق NSTIMER التالية (لا يوجد ضمان حقيقي عند إطلاق النار). ثم ربما تحصل على اثنين readDataWithTimeout:tag: المكالمات تعمل في نفس الوقت، ربما الحصول على مفوض المقبس الخلط.

الحل الأفضل هو "استطلاع طويل". على جانب iPhone، اتصل readDataWithTimeout:tag: مع مهلة طويلة إلى حد ما (قل 30-60s). في كل مرة تقوم فيها بإرجاع، فقط حلقة مرة أخرى في ذلك:

while (self.isRunning) {
    [socket readDataWithTimeout:60 tag:0];
}

ثم في -onSocketDidDisconnect: و -onSocket:willDisconnectWithError:, ، تأكد من تعيين self.isRunning ل NO. وبعد تخلص من NSTIMER بالكامل.

ما زلت لا نشر أي شيء من جانب .NET حتى يغير Winamp أغاني الأزارات بالفعل. إرسال نفس البيانات مرارا وتكرارا لا تفعل أي فهز.

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