потоковое программирование iPhone (CFStream) Hello World - PullRequest
3 голосов
/ 08 апреля 2010

В настоящее время я пытаюсь отправить Hello World со своего iPhone на удаленный компьютер с работающим сервером (проверено telnet на iPhone).

Вот мой код:

#import "client.h"

@implementation client

- (client*) client:init {
 self = [super init];
 [self connect];
 return self;
}

- (void)connect {
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[NSString stringWithFormat: @"192.168.1.1"], 50007, NULL, &writeStream);
  NSLog(@"Creating and opening NSOutputStream...");
  oStream = (NSOutputStream *)writeStream;
  [oStream setDelegate:self];
  [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  [oStream open];
}

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    NSLog(@"stream:handleEvent: is invoked...");

    switch(eventCode) {
        case NSStreamEventHasSpaceAvailable:
        {
            if (stream == oStream) {
                NSString * str = [NSString stringWithFormat: @"Hello World"];
                const uint8_t * rawstring =
    (const uint8_t *)[str UTF8String];
                [oStream write:rawstring maxLength:strlen(rawstring)];
                [oStream close];
            }
            break;
        }
    }
}

@end

Для клиента. Ч .:

#import <UIKit/UIKit.h>


@interface client : NSObject {
 NSOutputStream *oStream;
}

-(void)connect;

@end

Наконец, в AppDelegate.m:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
 [window makeKeyAndVisible];
 [client new];
}

Кто-нибудь имеет представление о том, что происходит не так?

1 Ответ

1 голос
/ 08 апреля 2010

Ваш формат инициализации неверен. Вместо init вы создали метод с именем client:, который принимает один немаркированный параметр (по умолчанию либо id, либо int - я думаю, что id, но я не могу вспомнить в данный момент) с именем init. Поскольку этот метод (клиент) никогда не вызывается, ваш клиент никогда не подключается. Вместо этого замените этот метод следующим:

- (id)init
{
  if( (self = [super init]) ) {
   [self connect];
  }
  return self;
}

Теперь, когда вы звоните [Client new], ваш клиент будет фактически инициализирован и вызовет connect для себя. Я также немного реструктурировал его так, чтобы он соответствовал общему шаблону инициализации Objective C / Какао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...