Frage

Ich versuche ein Programm für das iPhone im Simulator zu erhalten. Mein Problem ist das Empfangen von UDP -Daten. Ich benutze Asyncudpsocket. Wenn ich eine Steckdose mache und benutze sendData:(NSData) toHost:, ... Nun, es funktioniert gut.

Ich kann einfach nicht herausfinden, wie die Empfangsfunktionen funktionieren.

Ich nehme so etwas an:

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

Ich glaube, es sollte dann die Methode aufrufen -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Nun, ich habe ein NSLog in diese Methode gesteckt und sie wird nie aufgerufen. Nun [Socket Empfangen, ..] Ist die einzige Empfangsmethode, also sollte es das sein ... oder gibt es eine andere Methode, die ich verwenden muss? Oder muss ich einige Ergänzungen zu meinem Delegierten oder was auch immer ... Ich kann einfach nicht herausfinden, wie ich es tun muss

Ich habe nach AsyncUdpsocket -Beispielen, Tutorials, wie ('s) und mehr gesucht, aber ich kann einfach kein Beispiel finden. Wenn also jemand es erklären möchte oder einen mit einer guten Erklärung sitzt, wäre es sehr geschätzt.

Wenn Sie die Antwort sowieso nicht kennen, danke fürs Lesen!

War es hilfreich?

Lösung

Ich bin neu mit objektivem C (so bin ich mit meiner Unkenntnis davon), aber ich konnte Asyncudpsocketdelegate zum größten Teil dazu bringen. Ein paar Dinge, um zu versuchen/zu bestätigen:

  1. Stellen Sie sicher, dass self Klasse, die Sie initialisieren, als Ihr Socket -Delegierter ist die Klasse, an der Sie die Rückrufe erwarten.

  2. Stellen Sie sicher, dass Ihre Klasse die übernimmt AsyncUdpSocketDelegate Protokoll. Ich bin mir nicht sicher, ob dies tatsächlich notwendig ist, aber es könnte nicht schaden. Sieht in Ihrem Klassenkopf wie:

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

  3. Stellen Sie sicher, dass Ihre Delegiermethoden in Ihrem deklariert sind Schnittstelle und Implementierung. Die Methodensignatur sollte so aussehen:- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Versuchen Sie es zu rufen receiveWithTimeout mit einem Zeitlimitwert ungleich Null. Kann Ihnen unterschiedliche Ergebnisse geben.

  5. Verwenden Sie Wireshark, um sicherzustellen, dass Sie tatsächlich UDP -Daten erhalten, wann und wo Sie glauben. Ich versuche nicht, Ihre Intelligenz zu beleidigen, aber ich habe in der Vergangenheit versucht, Netzwerkcodefehler aufzuspüren, als das Problem tatsächlich meine Netzwerkkonfiguration war.

Andere Tipps

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

Ich bin mir nicht sicher, ob dies hilfreich sein wird, aber ich hatte das gleiche Problem, und hier ist, wie ich es behoben habe.

In meinem Fall war das Problem:

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

war am "falschen" Ort.

Wenn Sie anrufen self.socket receswithtimeout: -1 Tag: 0]; in der Methode didfinishlaunchingwithoptions, Die Steckdose funktioniert nicht, unabhängig davon, was Sie tun (auch wenn Sie versuchen, sie in einem neuen Thread zu starten). Um dieses Problem zu beheben, habe ich einen Knopf gemacht und die bewegt Empfangen mit Timeout Rufen Sie zu einer Methode, die aufgerufen wird, wenn die Schaltfläche klickt. Ich vermute, dass Asyncudpsocket etwas an dem Thread -Handling nicht mag didfinishlaunchingwithoptions.

Ich habe meinen funktionierenden Beispielcode unten gepostet (mit Xcode 5.1.1). Dies sind die vollständigen AppDelegate -Dateien für mein Xcode -Projekt.

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

Hoffe das ist für jemanden hilfreich.

Ich bin mit dieser Bibliothek nicht vertraut, aber ich schaue mir den Beispielcode aus ihrem Google -Code -Projekt an.

Zuerst sehe ich keine Erwähnung dieses Rückrufs, den Sie beschreiben. Sieht so aus, als ob Sie implementieren sollen:

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

Auch im Beispiel wird der Server mit der folgenden Zeile gestartet:

[listenSocket acceptOnPort:port error:&error]

Hier ist ein Link zum Beispielcode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top