【问题标题】:Creating a TCP Socket connection and keep the connection open across several views创建 TCP Socket 连接并在多个视图中保持连接打开
【发布时间】:2012-06-06 17:38:49
【问题描述】:

我已经使用 TCP 套接字成功地从 iPhone 连接到服务器(这是一台 Windows 机器)。目前,我正在使用一个按钮来执行以下代码:

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 库来打开我的 Sockets 连接。感谢您的帮助!

* 编辑 *

根据下面的答案,这就是我到目前为止所做的:

SocketConnection.h

#import <Foundation/Foundation.h>

@interface SocketConnection : NSObject
{

}

+ (SocketConnection *)getInstance;

@end

SocketConnection.m

静态 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

我还没有弄清楚单例类是如何被调用的。我使用上面的代码启动了我的应用程序,但它没有连接到服务器。有什么想法吗?

谢谢!

【问题讨论】:

  • 您可能想要创建一个单独的类(可能称为connectionKeeper 或其他名称)并在appDelegate applicationDidFinishLaunching: withOptions: 中启动它。 TCP 连接与视图控制器的视图无关,因此您应该将其分开。
  • 将代码移动到单例类或应用程序委托中
  • 如果我创建一个单独的类,那么该类在哪里“调用”以便套接字连接打开并保持打开状态?
  • 将其添加到单例类中,这样您将只能创建该类中的 1 个并在任何地方访问它
  • 对,我只是想了解我将在哪里创建单例类的对象。原谅我的无知,我以前从未使用过单例课程。感谢您的快速回复!

标签: iphone ios sockets networking singleton


【解决方案1】:

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

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;

【讨论】:

  • 非常感谢您花时间编写一些示例代码,但我并不真正了解这里发生的事情。你介意提供一点澄清吗?再次为我的无知道歉,但我对这个 iOS 东西还是很陌生 :)
  • 查看单例模式的 Wiki 文章:en.wikipedia.org/wiki/Singleton_pattern
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多