Question

Je suis en train d'obtenir un programme pour iPhone en cours d'exécution sur le simulateur. Mon problème est avec la réception de données UDP. J'utilise asyncUdpSocket. Si je fais une prise et l'utilisation sendData:(NSData) toHost:, ... il fonctionne très bien.

Le pense que je peux tout simplement pas comprendre comment fonctionne la réception des fonctions.

Je suppose que 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 mets un NSLog dans cette méthode et il est jamais appelé. Eh bien [réception de la socket, ..] est la seule méthode recevoir donc je suppose que ce doit être celui-là ... ou est-il une autre méthode que je dois utiliser? Ou dois-je faire quelques ajouts à mon délégué ou autre ... Je ne peux pas comprendre comment je dois le faire

Je cherchai par exemple asyncUdpSocket (s), 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 quand même pour la lecture!

Était-ce utile?

La solution

Je suis nouveau avec Objective C (donc supporter mon ignorance de celui-ci), mais je suis en mesure d'obtenir AsyncUdpSocketDelegate de 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 vous attendez à callbacks sur.

  2. Assurez-vous que votre classe adopte le protocole AsyncUdpSocketDelegate. Je ne sais pas si cela est vraiment nécessaire, mais il ne peut pas nuire. Dans votre tête de classe, ressemble à:

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

  3. Assurez-vous que vos méthodes de délégués ont déclaré dans votre interface et mise en œuvre. La signature de la méthode devrait 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 délai d'attente non nul. Peut vous donner des résultats différents.

  5. Utilisez Wireshark pour vous assurer que vous êtes en fait, la réception de données UDP et lorsque où vous pensez que vous êtes. je ne suis pas essayant d'insulter votre intelligence, mais j'ai passé un bon moment à essayer pour traquer les bogues de code de réseau le passé, quand la question était en fait ma configuration réseau.

Autres conseils

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];

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

Dans mon cas, le problème était que:

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

est situé à l'endroit "mal".

Si vous appelez [self.socket receiveWithTimeout: -1 tag: 0]; dans la méthode didFinishLaunchingWithOptions , la prise ne fonctionne pas, peu importe ce que vous faites (même si vous essayez de lancer il dans un nouveau thread). Pour résoudre ce problème, je me suis un bouton et déplacé le receiveWithTimeout appel à une méthode appelée lorsque le bouton est cliqué. Je pense que ASyncUdpSocket n'aime pas quelque chose au sujet de la manipulation de fil 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.

Je ne suis pas au courant de cette bibliothèque mais en regardant l'exemple de code de leur Google Code du projet révèle un certain nombre de choses.

D'abord, 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

En outre, dans l'exemple le serveur est démarré avec la ligne suivante:

[listenSocket acceptOnPort:port error:&error]

Voici un lien vers l'échantillon du .

scroll top