AsyncUdpSocket как использовать получение

Я пытаюсь запустить программу для iPhone на симуляторе. Моя проблема связана с получением данных UDP. Я использую asyncUdpSocket. Если я создам сокет и использую sendData:(NSData) toHost:,... он отлично работает.

Думаю, я просто не могу понять, как работают функции приема.

Я предполагаю что-то вроде этого:

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

Я считаю, что тогда он должен вызвать метод -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Ну, я поместил NSLog в этот метод, и он никогда не вызывается. Ну, [получение сокета,..] - единственный метод получения, поэтому я думаю, что это должен быть тот ... или есть другой метод, который я должен использовать? Или мне нужно внести некоторые дополнения в мой делегат или что-то еще... Я просто не могу понять, как мне это сделать

Я искал примеры asyncUdpSocket, учебные пособия, инструкции и многое другое, но я просто не могу найти пример. Так что, если кто-то хотел бы объяснить это или знает место с хорошим объяснением, это было бы очень признательно.

Если вы не знаете ответа, все равно спасибо за прочтение!


person Saren Inden    schedule 18.11.2010    source источник
comment
вы должны изменить тег asyncsocket на asyncudpsocket и добавить CoacoasyncSocket   -  person lm2s    schedule 18.03.2011
comment
Вы уже решили этот вопрос? Если нет, скажите мне, и я отправлю вам по электронной почте простой проект Xcode, который использует Bonjour и AsyncUdpSocket для отправки сообщения с iOS (клиент) на Mac OS X (сервер).   -  person lm2s    schedule 18.03.2011
comment
Im2s, не могли бы вы отправить мне свой проект по электронной почте? моя электронная почта [email protected]   -  person Andrey Chernukha    schedule 10.01.2012


Ответы (4)


Я новичок в Objective C (поэтому терпите мое невежество), но по большей части мне удалось получить AsyncUdpSocketDelegate. Несколько вещей, чтобы попробовать/подтвердить:

  1. Убедитесь, что класс self, который вы инициализируете в качестве делегата сокета, является классом, для которого вы ожидаете обратные вызовы.

  2. Убедитесь, что ваш класс принимает протокол AsyncUdpSocketDelegate. Я не уверен, что это действительно необходимо, но это не повредит. В заголовке вашего класса выглядит так:

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

  3. Убедитесь, что методы делегата объявлены в вашем интерфейсе иреализации. Сигнатура метода должна выглядеть так: - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Попробуйте вызвать receiveWithTimeout с ненулевым значением времени ожидания. Может дать вам разные результаты.

  5. Используйте Wireshark, чтобы убедиться, что вы действительно получаете данные UDP, когда и где вы думаете. Я не пытаюсь оскорбить ваш интеллект, но я потратил довольно много времени, пытаясь отследить ошибки сетевого кода в прошлом, когда проблема была на самом деле в конфигурации моей сети.

person Kongress    schedule 09.05.2011
comment
если вы принимаете формальный протокол, вам не нужно объявлять свои методы в интерфейсе. для этого и нужен протокол. - person Grady Player; 30.05.2011
comment
@Grady Исправлена ​​часть объявления интерфейса на основе вашего комментария. - person Kongress; 30.05.2011

Не уверен, что это будет полезно, но у меня была такая же проблема, и вот как я ее исправил.

В моем случае проблема заключалась в следующем:

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

оказался в «неправильном» месте.

Если вы вызываете [self.socket receiveWithTimeout:-1 tag:0]; в методе didFinishLaunchingWithOptions, socket не будет работать независимо от того, что вы делаете (даже если вы попытаетесь запустить его в новом потоке). Чтобы решить эту проблему, я сделал кнопку и переместил вызов receiveWithTimeout в метод, вызываемый при нажатии кнопки. Я предполагаю, что ASyncUdpSocket что-то не нравится в обработке потоков в didFinishLaunchingWithOptions.

Я разместил свой рабочий пример кода ниже (используя XCode 5.1.1). Это полные файлы AppDelegate для моего проекта 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

Надеюсь, это кому-то поможет.

person Graham    schedule 04.01.2017

Я не знаком с этой библиотекой, но просмотр примера кода из их проекта Google Code показывает несколько вещей.

Во-первых, я не вижу упоминания об этом обратном вызове, который вы описываете. Похоже, вы должны реализовать:

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

Также в примере сервер запускается следующей строкой:

[listenSocket acceptOnPort:port error:&error]

Вот ссылка на пример кода.

person hjaltij    schedule 15.03.2011
comment
Вы имеете в виду версию AsyncSocket (TCP), а не AsyncUdpSocket (UDP), о которой идет речь в исходном вопросе. - person lm2s; 18.03.2011

person    schedule
comment
мне нужна демо...плзз - person AKSH; 04.03.2016