2010-11-18 21 views
10

Estoy tratando de obtener un programa para iPhone ejecutándose en el simulador. Mi problema es con la recepción de datos UDP. Yo uso asyncUdpSocket. Si hago un socket y uso sendData:(NSData) toHost:, ... bueno, funciona bien.AsyncUdpSocket cómo usar recibir

Creo que no puedo entender cómo funcionan las funciones de recepción.

asumo algo como esto:

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

Creo que entonces debe llamar al método -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Bueno pongo un NSLog en ese método y nunca se llama. Bueno [socket receive, ..] es el único método de recepción, así que supongo que debería ser ese ... ¿o hay otro método que tengo que usar? O tengo que hacer algunas adiciones a mi delegado o lo que sea ... Simplemente no puedo entender cómo tengo que hacerlo

He buscado ejemplos asyncUdpSocket, tutoriales, cómo ('s) y más, pero simplemente no puedo encontrar un ejemplo. Entonces, si alguien quisiera explicarlo o conoce una sentada con una buena explicación, sería muy apreciado.

Si no sabes la respuesta, ¡gracias de todos modos por leerla!

+1

debe cambiar la etiqueta "asyncsocket" por "asyncudpsocket" y agregar "cocoaasyncsocket" – lm2s

+0

¿Ya ha resuelto este problema? Si no me lo dices, te enviaré un simple proyecto de Xcode que utiliza Bonjour y AsyncUdpSocket para enviar un mensaje de iOS (cliente) a Mac OS X (servidor). – lm2s

+0

Im2s ¿me pueden enviar ME por favor su proyecto? mi correo electrónico es [email protected] –

Respuesta

6

Soy nuevo con Objective C (así que tenga en cuenta mi ignorancia), pero he podido obtener AsyncUdpSocketDelegate para recibir, en su mayor parte. Unas pocas cosas para probar/confirmar:

  1. Asegúrese de que la clase self que va a inicializar como su delegado socket es la clase que usted está esperando en las devoluciones de llamada.

  2. Asegúrese de que su clase adopta el protocolo AsyncUdpSocketDelegate. No estoy seguro si esto es realmente necesario, pero no podría doler. En el encabezado de la clase, se ve como:

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

  3. Asegúrese de que tiene sus métodos de delegado declarados en la interfaz de y aplicación. La firma del método debe verse así: - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Intente llamar al receiveWithTimeout con un valor de tiempo de espera distinto de cero. Puede darte diferentes resultados.

  5. Utilice Wireshark para asegurarse de que es de hecho recibiendo datos UDP cuando y donde cree que se encuentra.No estoy tratando de insultar a su inteligencia, pero he pasado bastante tiempo intentando para localizar errores de código de red en cuando el problema era realmente mi configuración de red.

+2

si está adoptando un protocolo formal, no necesita declarar sus métodos en la interfaz. para eso es el protocolo. –

+1

+1 para el wireshark, me ha salvado tantas veces. –

+0

@ Grady Se corrigió la parte sobre la declaración de la interfaz basada en su comentario. – Kongress

-2

No estoy familiarizado con esta biblioteca, pero al mirar el código de muestra de su Proyecto de código de Google, se muestran algunas cosas.

En primer lugar, no veo ninguna mención de esta devolución de llamada que usted describe. Parece que se supone que debes poner en práctica:

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

También en el ejemplo que se inicie el servidor con la siguiente línea:

[listenSocket acceptOnPort:port error:&error] 

Aquí hay un enlace a la sample code.

+1

Usted se está refiriendo a la versión AsyncSocket (TCP), no a AsyncUdpSocket (UDP) como se trata la pregunta original. – lm2s

+0

Ahh, lo siento. – 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

Necesito la demo ... por favor – AKSH

0

No estoy seguro si esto será útil, pero no tenía el mismo problema, y ​​aquí es cómo lo arreglé.

En mi caso, el problema era que:

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

se encuentra en el lugar "equivocado".

Si llama al [self.socket receiveWithTimeout: -1 etiqueta: 0]; en el método didFinishLaunchingWithOptions, el socket no funcionará independientemente de lo que haga (incluso si intenta iniciarlo en un nuevo hilo). Para solucionar este problema, hice un botón y moví la llamada receiveWithToutout a un método llamado cuando se hace clic en el botón. Supongo que a ASyncUdpSocket no le gusta algo sobre el manejo de subprocesos en didFinishLaunchingWithOptions.

He publicado mi código de muestra de trabajo a continuación (utilizando XCode 5.1.1). Estos son los archivos completos de AppDelegate para mi proyecto de 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 

la esperanza que esto sea útil a alguien.

Cuestiones relacionadas