2010-11-18 6 views
10

प्राप्त करने के लिए कैसे उपयोग करें I सिम्युलेटर पर चल रहे आईफोन के लिए एक प्रोग्राम प्राप्त करने का प्रयास कर रहा हूं। मेरी समस्या यूडीपी डेटा प्राप्त करने के साथ है। मैं asyncUdpSocket का उपयोग करता हूं। यदि मैं सॉकेट बनाता हूं और sendData:(NSData) toHost: का उपयोग करता हूं, तो यह ठीक काम करता है।AsyncUdpSocket

मुझे लगता है कि मैं यह नहीं समझ सकता कि प्राप्त कार्य कैसे काम करता है।

मैं कुछ इस तरह मान:

socket = [[AsyncUdpSocket alloc] initWithDelegate:self]; 
[socket bindToPort:8000] error:nil] //returns YES 
[socket receiveWithTimeout:-1 tag:1]; 

मेरा मानना ​​है कि यह तो विधि -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

खैर मैं उस विधि में एक NSLog डाल बुलाना चाहिए और यह कभी कहा जाता है। खैर [सॉकेट प्राप्त, ..] एकमात्र प्राप्त विधि है इसलिए मुझे लगता है कि यह एक होना चाहिए ... या क्या मुझे कोई और तरीका उपयोग करना है? या मुझे अपने प्रतिनिधि या कुछ भी कुछ जोड़ना है ... मैं बस यह नहीं समझ सकता कि मुझे इसे कैसे करना है

मैंने asyncUdpSocket उदाहरण (ट्यूटोरियल), कैसे करें (ओं) की खोज की है और अधिक लेकिन मुझे बस एक उदाहरण नहीं मिल रहा है। तो अगर कोई इसे समझाना चाहेगा या एक अच्छी व्याख्या के साथ बैठना चाहेगा तो इसकी बहुत सराहना की जाएगी।

यदि आपको उत्तर के बारे में पता नहीं है तो पढ़ने के लिए वैसे भी धन्यवाद!

+1

आपको "asyncsocket" टैग को "asyncudpsocket" में बदलना चाहिए और "कोकोआसिंक्ससेट" – lm2s

+0

जोड़ना चाहिए क्या आपने पहले से ही इस समस्या का समाधान किया है? अगर मुझे नहीं बताते हैं और मैं आपको एक साधारण एक्सकोड प्रोजेक्ट ईमेल करूंगा जो आईओएस (क्लाइंट) से मैक ओएस एक्स (सर्वर) में एक संदेश भेजने के लिए बोनजोर और असिनकयूडस्पॉकेट का उपयोग करता है। – lm2s

+0

आईएम 2 क्या आप कृपया मुझे अपनी परियोजना ईमेल कर सकते हैं? मेरा ईमेल है [email protected] –

उत्तर

6

मैं उद्देश्य सी के साथ नया हूं (इसलिए इसकी अज्ञानता के साथ सहन करें), लेकिन मैं अधिकांश भाग के लिए AsyncUdpSocketDelegate प्राप्त करने में सक्षम हूं। कुछ बातें की कोशिश करने का/की पुष्टि:

  1. यकीन self वर्ग है कि आप अपने सॉकेट प्रतिनिधि के रूप में आरंभ कर रहे हैं वर्ग है कि आप पर कॉलबैक की उम्मीद कर रहे है।

  2. सुनिश्चित करें कि आपकी कक्षा AsyncUdpSocketDelegate प्रोटोकॉल को गोद ले। मुझे यकीन नहीं है कि यह वास्तव में आवश्यक है, लेकिन यह चोट नहीं पहुंचा सकता है। अपनी कक्षा हेडर में, लगता है कि:

    @interface |your class| : |super class| <|Other protocol(s)|, AsyncUdpSocketDelegate> {

  3. करें कि आप अपने प्रतिनिधि के तरीकों अपने इंटरफेस और कार्यान्वयन में घोषित किया हुआ है। विधि हस्ताक्षर इस तरह दिखना चाहिए: - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. गैर-शून्य टाइमआउट मान के साथ receiveWithTimeout पर कॉल करने का प्रयास करें। आपको अलग-अलग परिणाम दे सकते हैं।

  5. यह सुनिश्चित करने के लिए वेयरहार्क का उपयोग करें कि आप वास्तव में यूडीपी डेटा प्राप्त करते हैं और जहां आप सोचते हैं कि आप हैं।मैं आपकी बुद्धि का अपमान करने की कोशिश नहीं कर रहा हूं, लेकिन को में नेटवर्क कोड कीड़े को ट्रैक करने के लिए मैंने कुछ समय बिताया है, जब समस्या वास्तव में मेरा नेटवर्क कॉन्फ़िगरेशन था।

+2

यदि आप औपचारिक प्रोटोकॉल अपना रहे हैं तो आपको इंटरफ़ेस में अपनी विधियों की घोषणा करने की आवश्यकता नहीं है। प्रोटोकॉल के लिए यही है। वायरसहार्क के लिए –

+1

+1, इसने मुझे कई बार बचाया है। –

+0

@Grady ने आपकी टिप्पणी के आधार पर इंटरफ़ेस घोषणा के बारे में हिस्सा सही किया। – Kongress

-2

मैं इस पुस्तकालय से परिचित नहीं हूं लेकिन अपने Google कोड प्रोजेक्ट से नमूना कोड देखकर कुछ चीजें बताती हैं।

सबसे पहले, मुझे आपके द्वारा वर्णित इस कॉलबैक का कोई उल्लेख नहीं दिखाई देता है। ऐसा लगता है कि लागू करने के लिए माना जाता कर रहे हैं:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 

भी उदाहरण में सर्वर निम्न पंक्ति के साथ शुरू किया गया है:

[listenSocket acceptOnPort:port error:&error] 

यहाँ sample code के लिए एक लिंक है।

+1

आप AsyncSocket (TCP) संस्करण को रेफर कर रहे हैं, न कि AsyncUdpSocket (UDP) के रूप में मूल प्रश्न है। – lm2s

+0

आह, मुझे खेद है। – hjaltij

1
AsyncUdpSocket *socket=[[AsyncUdpSocket alloc]initWithDelegate:self];  
//receiveWithTimeout is necessary or you won't receive anything 
[socket receiveWithTimeout:-1 tag:2]; //-------here 
NSData *data=[@"Hello from iPhone" dataUsingEncoding:NSUTF8StringEncoding]; 
[socket sendData:data toHost:bchost port:9003 withTimeout:-1 tag:1]; 
+0

मुझे डेमो की जरूरत है ... plzz – AKSH

0

सुनिश्चित नहीं हैं कि अगर यह उपयोगी होगा, लेकिन मैं एक ही समस्या थी, और यहाँ मैं इसे कैसे तय है।

[self.socket receiveWithTimeout:-1 tag:0]; 

"गलत" जगह में स्थित था:

मेरे मामले में, समस्या यह है कि था।

यदि आप पर कॉल करते हैं [self.socket getWithTimeout: -1 टैग: 0]; विधि didFinishLaunchingWithOptions, सॉकेट आपके द्वारा किए गए कार्यों के बावजूद काम नहीं करेगा (भले ही आप इसे नए थ्रेड में लॉन्च करने का प्रयास करें)। इस समस्या को ठीक करने के लिए, मैंने एक बटन बनाया और प्राप्त किया गया WITTimeout बटन क्लिक होने पर कॉल की गई विधि को कॉल करें। मेरा अनुमान है कि ASyncUdpSocket को में थ्रेड हैंडलिंग के बारे में कुछ पसंद नहीं आया हैफिनिशलांचिंगविथऑप्शन

मैंने नीचे अपना कामकाजी नमूना कोड पोस्ट किया है (एक्सकोड 5.1.1 का उपयोग करके)। ये मेरी एक्सकोड परियोजना के लिए पूरी ऐपडिलेगेट फाइलें हैं।

AppDelegate.h

#import <UIKit/UIKit.h> 
#import "AsyncUdpSocket.h" 

@interface AppDelegate : UIResponder <UIApplicationDelegate, AsyncUdpSocketDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (strong, nonatomic) AsyncUdpSocket *udpSocket; 
@property (strong, nonatomic) UILabel *receiver; 

@end 

AppDelegate.m

#import "AppDelegate.h" 
#import "AsyncUdpSocket.h" 
#import <UIKit/UIKit.h> 
#import <CFNetwork/CFNetwork.h> 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Create the main window 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 

    // Create a label for showing received text 
    self.receiver = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 80.0)]; 
    self.receiver.text = @"No message, yet!"; 
    self.receiver.textColor  = [UIColor blackColor]; 
    [self.window addSubview:self.receiver]; 

    // Create a button for sending messages 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setFrame:CGRectMake(80.0, 210.0, 160.0, 40.0)]; 
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 
    [button setTitle:@"Start Game" forState:UIControlStateNormal]; 
    [button setBackgroundColor:[UIColor blueColor]]; 
    [self.window addSubview:button]; 

    @try { 
     self.udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self]; 
     if (![self.serverSocket bindToPort:9003 error:nil]) { 
      NSLog(@"COULD NOT BIND TO PORT"); 
     } 
     if (![self.udpSocket enableBroadcast:YES error:nil]) { 
      NSLog(@"COULD NOT ENABLE BROADCASTING"); 
     } 
    } @catch (NSException * e) { 
     NSLog(@"Exception: %@", e); 
    } 
    return YES; 
} 

- (void)buttonClick:(UIButton*)button { 
    NSData * data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding]; 
    [self.udpSocket receiveWithTimeout:-1 tag:0]; 
    if (![self.udpSocket sendData:data toHost:@"127.0.0.1" port:9003 withTimeout:0.2 tag:1]) { 
     NSLog(@"COULD NOT SEND DATA"); 
    } else { 
     NSLog(@"Sent packet (from %@:%d to 127.0.0.1:9001)", self.udpSocket.localHost, self.udpSocket.localPort); 
    } 
} 

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port { 
    NSLog(@" Received data (from %@:%d) - %@", host, port, data); 
    self.receiver.text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
    [self.udpSocket receiveWithTimeout:-1 tag:0]; 

    return YES; 
} 

@end 

आशा इस किसी के लिए उपयोगी है।