iphone:没有发生客户端 - 服务器通信

时间:2011-05-31 06:44:57

标签: iphone client-server communication

我为客户端服务器编程进行了以下编程,但它无法正常工作。服务器无法接收连接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 个答案:

答案 0 :(得分:2)

您只能打开流,不会对它们执行任何操作。这就像拿起电话而不拨号码。使用NSStreamDelegate协议实现数据传输代码。

<强>更新

您可以使用以下行来设置流的代理:

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

现在实现在您自己的类中NSStreamDelegate协议中定义的方法(AFAIK - 只有其中一个)。了解如何从那里接收/发送数据。

答案 1 :(得分:1)

您是否有使用流的特定原因?

使用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方法需要特定于您发回的任何Web服务。 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];
}

答案 2 :(得分:0)

JB gate,

在您的代码中,您通知iStream和oStream,您的clientserverprogramViewController对象将成为每个对象的委托。但是,适当的代表需要实际实施。您的类需要实现此方法:

– stream:handleEvent:

详细信息请记录在这里:

此外,您的代码无法在真正的iPhone上运行。有一个更新的Core Foundation API用于创建套接字对details here

<强>更新

只是想知道这不是软件问题,但服务器可能是在防火墙后面。请详细说明服务器是什么,即webserver,netcat或简单的TCP套接字等。

彼得