2012-06-01 60 views
2

我已成功地使用TCP套接字从iPhone连接到服务器(这是一台Windows机器)。目前,我使用一个按钮来执行以下代码:创建一个TCP套接字连接并保持连接在多个视图中打开

while(1) 
{ 
    Socket *socket; 
    int port = 11005; 
    NSString *host = @"9.5.3.63"; 

    socket = [Socket socket]; 

    @try 
    { 
     NSMutableData *data; 
     [socket connectToHostName:host port:port]; 
     [socket readData:data]; 
     // [socket writeString:@"Hello World!"]; 

     //** Connection was successful **// 
     [socket retain]; // Must retain if want to use out of this action block. 
    } 
    @catch (NSException* exception) 
    { 
     NSString *errMsg = [NSString stringWithFormat:@"%@",[exception reason]]; 
     NSLog(errMsg); 
     socket = nil; 
    } 
} 

这是比较容易的部分......我想尽快建立套接字连接的应用程序加载。我试着把这段代码放在我的viewDidLoad中,但循环是无限的,视图永远不会加载。我在我的项目中有几个视图,我想打开连接,在所有视图中始终打开连接。

目的:

  • 打开TCP套接字连接时,应用程序首次加载
  • 保持连接无限,无论我在(在项目中的多个视图)

我还是什么看法对于iOS开发来说很新颖,所以我尽可能多地理解它。应该指出,我正在使用SmallSockets库来打开我的套接字连接。谢谢您的帮助!

*编辑*

基于关闭下面的答案,这是我走到这一步,打算:

SocketConnection.h

#import <Foundation/Foundation.h> 

@interface SocketConnection : NSObject 
{ 

} 

+ (SocketConnection *)getInstance; 

@end 

SocketConnection.m

static SocketConnection * sharedInstance = nil;

@implementation SocketConnection 

- (id)init 
{ 
    self = [super init]; 

    if (self) 
    { 
     while(1) 
     { 
      Socket *socket; 
      int port = 11005; 
      NSString *host = @"9.5.3.63"; 

      socket = [Socket socket]; 

      @try 
      { 
       NSMutableData *data; 
       [socket connectToHostName:host port:port]; 
       [socket readData:data]; 
       // [socket writeString:@"Hello World!"]; 

       //** Connection was successful **// 
       [socket retain]; // Must retain if want to use out of this action block. 
      } 
      @catch (NSException* exception) 
      { 
       NSString *errMsg = [NSString stringWithFormat:@"%@",[exception reason]]; 
       NSLog(errMsg); 
       socket = nil; 
      } 
     } 
    } 
    return self; 
} 

+ (SocketConnection *)getInstance 
{ 
    @synchronized(self) 
    { 
     if (sharedInstance == nil) 
     { 
      sharedInstance = [[SocketConnection alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 

@end 

我还没有想出如何调用singleton类。我用上面的代码启动了我的应用程序,并且它没有连接到服务器。有任何想法吗?

谢谢!

+0

你可能会想创建一个单独的类(也许称为'connectionKeeper'或其他),并在'appDelegate'中启动它''applicationDidF inishLachingching:withOptions:'。 TCP连接与视图控制器的视图无关,所以你应该保持独立。 –

+0

将代码移动到singlton类或appdelegate –

+0

如果我创建了一个单独的类,那么类“调用”在哪里,以便套接字连接变为打开并保持打开状态? – Skizz

回答

4

您应该创建一个单例类,来保持你的连接,如下面的代码:

.h文件:

#import <Foundation/Foundation.h> 
    @interface SocketConnection : NSObject 
    { 
    } 

    + (SocketConnection *)getInstance; 

    @end; 

M档:

#import "SocketConnection.h" 

static SocketConnection *sharedInstance = nil; 

@implementation SocketConnection 

- (id)init 
{ 
    self = [super init]; 

    if (self) { 
    } 
    return self; 
} 

+ (SocketConnection *)getInstance 
{ 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [[SocketConnection alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 

@end; 
+0

我真的很感激你花时间写出一些示例代码,但我并不真正关注这里发生的事情。你介意提供一点澄清?再次,我为无知道歉,但我仍然很新的这个iOS的东西:) – Skizz

+0

查看维基文章的单例模式:http://en.wikipedia.org/wiki/Singleton_pattern – CarlJ