2010-11-18 6 views
10

J'essaie d'obtenir un programme pour iPhone fonctionnant sur le simulateur. Mon problème est avec la réception de données UDP. J'utilise asyncUdpSocket. Si je fais une prise et utilise sendData:(NSData) toHost:, ... ça marche bien.AsyncUdpSocket comment utiliser recevoir

La réflexion que je ne peux pas comprendre est comment les fonctions de réception fonctionnent.

Je suppose quelque chose comme ceci:

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

Je crois qu'il devrait alors appeler la méthode -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Eh bien je peux mettre un NSLog dans cette méthode et il est jamais appelé. Eh bien [socket receive, ..] est la seule méthode de réception donc je suppose que ça devrait être celle-là ... ou y at-il une autre méthode que je dois utiliser? Ou dois-je faire quelques ajouts à mon délégué ou quoi que ce soit ... Je ne peux pas comprendre comment je dois le faire

J'ai cherché des exemples de asyncUdpSocket, des tutoriels, comment (s) et plus mais je ne peux pas trouver un exemple. Donc, si quelqu'un voudrait l'expliquer ou connaît un sit avec une bonne explication, il serait très apprécié.

Si vous ne connaissez pas la réponse merci de toute façon pour la lecture!

+1

vous devriez changer le tag "asyncsocket" en "asyncudpsocket" et ajouter "cocoaasyncsocket" – lm2s

+0

Avez-vous déjà résolu ce problème? Si ce n'est pas le cas, dites-le moi et je vous enverrai un projet Xcode simple qui utilise Bonjour et AsyncUdpSocket pour envoyer un message d'iOS (client) à Mac OS X (serveur). – lm2s

+0

Im2s pouvez-vous s'il vous plaît écrivez-moi votre projet? mon email est [email protected] –

Répondre

6

Je suis nouveau avec Objective C (donc supporter mon ignorance), mais j'ai pu obtenir AsyncUdpSocketDelegate pour recevoir, pour la plupart. Quelques choses à essayer/confirmer:

  1. Assurez-vous que la classe self que vous initialisez comme délégué socket est la classe que vous attendez les callbacks sur.

  2. Assurez-vous que votre classe adopte le protocole AsyncUdpSocketDelegate. Je ne suis pas sûr que ce soit vraiment nécessaire, mais ça ne pourrait pas faire de mal. Dans votre tête de classe, ressemble à:

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

  3. Assurez-vous que vous avez vos méthodes de délégué déclarées dans l'interface et mise en œuvre. La signature de la méthode doit ressembler à ceci: - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Essayez d'appeler receiveWithTimeout avec une valeur de temporisation non nulle. Peut vous donner des résultats différents. Utilisez Wireshark pour vous assurer que vous êtes en train de recevoir des données UDP et où vous pensez que vous êtes.Je ne suis pas en essayant d'insulter votre intelligence, mais j'ai passé un certain temps à essayer de traquer les bogues de code réseau dans le passé quand le problème était en réalité ma configuration réseau.

+2

Si vous adoptez un protocole formel, vous n'avez pas besoin de déclarer vos méthodes dans l'interface. c'est ce que le protocole est pour. –

+1

+1 pour le wireshark, cela m'a sauvé tant de fois. –

+0

@Grady Correction de la partie concernant la déclaration de l'interface en fonction de votre commentaire. – Kongress

-2

Je ne suis pas familier avec cette bibliothèque, mais en regardant l'exemple de code de leur projet de code Google révèle quelques choses. Premièrement, je ne vois aucune mention de ce rappel que vous décrivez. On dirait que vous êtes censé mettre en œuvre:

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

également dans l'exemple le serveur est démarré avec la ligne suivante:

[listenSocket acceptOnPort:port error:&error] 

Voici un lien vers la sample code.

+1

Vous référez à la version d'AsyncSocket (TCP), pas à AsyncUdpSocket (UDP) comme la question originale est environ. – lm2s

+0

Ahh, je suis désolé. – 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

J'ai besoin de la démo ... plzz – AKSH

0

Je ne sais pas si cela sera utile, mais j'ai eu le même problème, et voici comment je l'ai fixé.

Dans mon cas, le problème est que:

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

était situé à l'endroit "mauvais". Si vous appelez le [self.socket receiveWithTimeout: -1 tag: 0]; La socket ne fonctionnera pas quel que soit ce que vous faites (même si vous essayez de le lancer dans un nouveau thread) dans la méthode didFinishLaunchingWithOptions Pour résoudre ce problème, j'ai créé un bouton et déplacé l'appel receiveWithTimeout vers une méthode appelée lorsque le bouton est cliqué. Ma conjecture est que ASyncUdpSocket n'aime pas quelque chose à propos de la gestion des threads dans didFinishLaunchingWithOptions.

J'ai posté mon exemple de code de travail ci-dessous (en utilisant XCode 5.1.1). Ce sont les fichiers AppDelegate complets pour mon projet Xcode.

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 

Espérons que cela est utile à quelqu'un.

Questions connexes