2011-05-31 39 views
1

我为客户端服务器编程做了以下编程,但它不起作用。服务器无法接收连接setup.plz帮助请求。iphone:客户端 - 服务器通信不发生

#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 
+5

朋友,这是你的第25 question..You应该学会如何格式化您的问题.. – Krishnabhadra 2011-05-31 06:51:55

+1

....什么工作,什么不,什么错误消息,等等,等等,等等..... – KevinDTimm 2011-05-31 07:11:18

回答

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

你只打开流,不要对它们做任何事情。这就像拿起电话而不拨号码。使用NSStreamDelegate协议来实现数据传输代码。

更新

你有这些线是流设置委托:

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

现在实施NSStreamDelegate协议中定义你自己的类方法(据我所知 - 这里只有一个他们)。了解如何从那里接收/发送数据。

+0

@ eimantas如何使用nsstreamdelegate和在哪里使用它。 ima begginer,并没有太多的知识,可以üplz建议我一个套接字编程的书在目标c中,其中编程与例 – 2011-06-02 10:57:50

+1

如果你是新来的Objective C和可可,我建议学习它的设计模式而不是直接跳入像网络编程这样复杂的话题。代表团是可可中最常用的设计模式之一。我相信你会找到一些例子,如果你只是尝试谷歌。 – Eimantas 2011-06-02 11:08:18

+0

@ Eimantas是上面给出的能够与服务器进行套接字连接的程序。 – 2011-06-02 11:27:18

0

JB门,

在你的代码告知istream和ostream的,你clientserverprogramViewController目的是为每一个代表。但是,一个合适的代表需要实际执行。你的类需要实现此方法:

– stream:handleEvent:

的细节记录在这里:

而且,您的代码将无法在实际工作苹果手机。有一个更新的Core Foundation API用于创建套接字对,details here

更新

只是想知道这是不是一个软件问题,但也许服务器位于防火墙后面。请详细说明一下服务器,Web服务器,即,netcat的,或简单的TCP套接字等

彼得

+0

@ peter T为什么它不能在真正的手机上工作 – 2011-06-07 11:02:16

+0

@ Junior Bill gates [806116](http://stackoverflow.com/questions/806116/is-there-anything-like-getstreamstohost-on-real-iphone-device )描述了如何使用'CFStreamCreatePairWithSocketToHost'而不是'getStreamsToHost'。 – 2011-07-21 20:49:05