Domanda

Sto cercando di ottenere un programma per iPhone in esecuzione sul simulatore. Il mio problema è la ricezione di dati UDP. Uso asyncudpsocket. Se faccio una presa e utilizzo sendData:(NSData) toHost:, ... beh, funziona bene.

Il pensiero che non posso capire è come funzionano le funzioni di ricezione.

Presumo qualcosa del genere:

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

Credo che dovrebbe quindi chiamare il metodo -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Beh, ho messo un NSLog in quel metodo e non viene mai chiamato. Bene [Ricevi di socket, ..] è l'unico metodo di ricezione, quindi immagino che dovrebbe essere quello ... o c'è un altro metodo che devo usare? O devo fare alcune aggiunte al mio delegato o altro ... Non riesco proprio a capire come devo farlo

Ho cercato esempi di asyncudpsocket, tutorial, come (s) e altro ancora, ma non riesco proprio a trovare un esempio. Quindi, se qualcuno desidera spiegarlo o sappia un sedo con una buona spiegazione, sarebbe molto apprezzato.

Se non conosci la risposta grazie comunque per aver letto!

È stato utile?

Soluzione

Sono nuovo con l'obiettivo C (quindi sopporta la mia ignoranza di esso), ma sono stato in grado di ricevere AsyncudPsocketDelegate, per la maggior parte. Alcune cose da provare/confermare:

  1. Assicurati il self Classe che stai inizializzando come delegato del tuo socket è la classe su cui ti aspetti i callback.

  2. Assicurati che la tua classe adotti il AsyncUdpSocketDelegate protocollo. Non sono sicuro che questo sia effettivamente necessario, ma non potrebbe far male. Nell'intestazione della tua classe, sembra:

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

  3. Assicurati di avere i tuoi metodi delegati dichiarati nel tuo interfaccia e implementazione. La firma del metodo dovrebbe apparire così:- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Prova a chiamare receiveWithTimeout con un valore di timeout diverso da zero. Può darti risultati diversi.

  5. Usa WireShark per assicurarti di ricevere effettivamente i dati UDP quando e dove pensi di essere. Non sto cercando di insultare la tua intelligenza, ma in passato ho trascorso un bel po 'di tempo a rintracciare i bug del codice di rete quando il problema era in realtà la mia configurazione di rete.

Altri suggerimenti

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

Non sono sicuro che questo sarà utile, ma ho avuto lo stesso problema, ed ecco come l'ho risolto.

Nel mio caso, il problema era quello:

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

era situato nel luogo "sbagliato".

Se chiami Self.socket riceve con il tag: -1: 0]; nel metodo didfinishlaunchingwithoptions, la presa non funzionerà indipendentemente da ciò che fai (anche se provi a lanciarlo in un nuovo thread). Per risolvere questo problema, ho creato un pulsante e ho spostato il ricevere con i tempi Chiama a un metodo chiamato quando si fa clic sul pulsante. La mia ipotesi è che AsyncudPsocket non piace qualcosa sulla gestione del filo didfinishlaunchingwithoptions.

Di seguito ho pubblicato il mio codice di esempio funzionante (usando Xcode 5.1.1). Questi sono i file appdleGate completi per il mio progetto 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

Spero che questo sia utile per qualcuno.

Non ho familiarità con questa libreria, ma guardare il codice di esempio dal loro progetto di codice Google rivela alcune cose.

Prima di, non vedo alcuna menzione di questo callback che descrivi. Sembra che dovresti implementare:

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

Anche nell'esempio il server viene avviato con la seguente riga:

[listenSocket acceptOnPort:port error:&error]

Ecco un link al codice di esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top