iphone: связь между клиентом и сервером отсутствует - PullRequest
1 голос
/ 31 мая 2011

Я сделал следующее программирование для программирования клиент-сервер, но оно не работает. сервер не может получить запрос на помощь по установке setup.plz.

#import "clientserverprogramViewController.h"
#import "secondview.h"
#import <CoreFoundation/CFSocket.h>
#include <sys/socket.h>
#include <netinet/in.h>

NSInputStream *iStream;
NSOutputStream *oStream; 

@implementation clientserverprogramViewController

@synthesize  name,filepath,display;

-(IBAction) print {
    NSString *urlStr = serverIP;]
    [display setText : urlStr];

    if (![urlStr isEqualToString:@""]) {
        NSURL *website = [NSURL URLWithString:urlStr];

        if (!website) {
            NSLog(@"%@ is not a valid URL");
            return;
        }
        NSHost *host = [NSHost hostWithName:[website host]];

        [NSStream getStreamsToHost:host port:3000 inputStream:&iStream  outputStream:&oStream];

        [iStream retain];
        [oStream retain];

        [iStream setDelegate:self];
        [oStream setDelegate:self];
        [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSDefaultRunLoopMode];

        [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSDefaultRunLoopMode];

        [iStream open];
        [oStream open];
    }
}

-(IBAction) settings {
    [self presentModalViewController:nextview animated: YES];
}


-(IBAction) cancel {
    exit(0);
}

- (void)dealloc {
    [super dealloc];
}

@end

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Вы только открываете потоки и ничего с ними не делаете.Это все равно что взять трубку и не набирать номер.Используйте протокол NSStreamDelegate для реализации кода передачи данных.

Обновление :

У вас есть эти строки, которые устанавливают делегата для потоков:

[iStream setDelegate:self];
[oStream setDelegate:self];

Теперь реализуйте методы, которые определены в протоколе NSStreamDelegate, в своем собственном классе (AFAIK - есть только один из них).Посмотрите, как получать / отправлять данные оттуда.

1 голос
/ 08 июня 2011

Есть ли конкретная причина, по которой вы используете потоки?

Как насчет использования NSURLConnection? Вот кусок кода из моего проекта. Оба находятся в KANetworkManager. KANetworkTransactionType - это просто перечисление, которое помогает мне понять, как анализировать ответ.

+ (void) createAndStartUrlConnection:(NSMutableURLRequest *)request type:(KANetworkTransactionType)type target:(id)target callback:(SEL)callback;
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    NSDictionary *requestDict = [NSDictionary dictionaryWithObjectsAndKeys:request, @"request", [NSNumber numberWithInt:type], @"type", target, @"target", [NSValue valueWithPointer:callback], @"callback", nil];

    [KANetworkManager performSelectorInBackground:@selector(makeNetworkCall:) withObject:requestDict];
}

Я могу сделать синхронный сетевой вызов, потому что я всегда вызываю этот метод в своем собственном потоке. Это более простой способ достижения асинхронного сетевого взаимодействия без работы с делегатами (хотя метод делегатов дает некоторые преимущества). Ваш метод parseResponse должен быть специфичен для любой отправляемой вами веб-службы. parseResponse уведомит метод обратного вызова. Дайте мне знать, если у вас есть дополнительные вопросы по этому поводу.

+ (void) makeNetworkCall:(NSDictionary *)params
{
    // We assume this method won't be called from the main thread, so we need our own NSAutoreleasePool.
    NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];

    NSMutableURLRequest *request = [params objectForKey:@"request"];
    KANetworkTransactionType type = [(NSNumber *)[params objectForKey:@"type"] intValue];
    id target = [params objectForKey:@"target"];
    SEL callback = (SEL)[[params objectForKey:@"callback"] pointerValue];

    NSURLResponse *response;
    NSError *err;
    // We make a synchronous request assuming we're on a background thread.
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    if (data.length > 0)
    {        
        [self parseResponse:data type:type target:target callback:callback];
    }
    else
    {
        NSLog(@"Error occured during network call. %@", err);
    }

    [autoreleasePool drain];
}
0 голосов
/ 03 июня 2011

JB ворота,

В своем коде вы сообщаете iStream и oStream, что ваш объект clientserverprogramViewController должен быть делегатом для каждого. Однако надлежащий делегат нуждается в реальной реализации. Ваш класс должен реализовать этот метод:

– stream:handleEvent:

Подробности документированы здесь:

Кроме того, ваш код не будет работать на реальном iPhone. Существует обновленный базовый API-интерфейс для создания пары сокетов, подробности здесь .

Обновление

Просто интересно, не является ли это проблемой программного обеспечения, но, возможно, сервер находится за брандмауэром. Пожалуйста, опишите подробно, что такое сервер, то есть веб-сервер, netcat или простой сокет TCP и т. Д.

Peter

...