【发布时间】: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或其他名称)并在appDelegateapplicationDidFinishLaunching: withOptions:中启动它。 TCP 连接与视图控制器的视图无关,因此您应该将其分开。 -
将代码移动到单例类或应用程序委托中
-
如果我创建一个单独的类,那么该类在哪里“调用”以便套接字连接打开并保持打开状态?
-
将其添加到单例类中,这样您将只能创建该类中的 1 个并在任何地方访问它
-
对,我只是想了解我将在哪里创建单例类的对象。原谅我的无知,我以前从未使用过单例课程。感谢您的快速回复!
标签: iphone ios sockets networking singleton