1

我从应用程序启动连接到服务器时在 appdelegate 中设置了套接字连接。在 appdelegate.h

@interface AppDelegate : NSObject <NSStreamDelegate,UIApplicationDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
    NSInputStream *inputStream;
 NSOutputStream *outputStream;
}

然后在 appdelegate.m 中设置连接到服务器:

 CFReadStreamRef readStream;
 CFWriteStreamRef writeStream;
 CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"111.111.111.11", 111, &readStream, &writeStream);

 inputStream = (NSInputStream *)readStream;
 outputStream = (NSOutputStream *)writeStream;
 [inputStream setDelegate:self];
 [outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
 [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
 [inputStream open];
 [outputStream open];

应用启动时运行良好。沟通也很好。

然后我有一个标签控制器。每个选项卡都需要通过此套接字与服务器交换数据。我不想为每个选项卡创建不同的套接字。

如何使用相同的输出流/输入流?

我在 firstviewcontroall.m 中尝试了这个但失败了:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSData *data = [[NSData alloc] initWithData:[@"hello this is firstview" dataUsingEncoding:NSUTF8StringEncoding]];
 [outputStream write:[data bytes] maxLength:[data length]];
}

没有数据发送到服务器。我不想在每个视图控制器上创建一个到服务器的套接字。太浪费资源了。我的问题是如何通过一个套接字连接发送/接收数据?

4

2 回答 2

2

通过以下方式使用流:

AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDel.outputStream write:[data bytes] maxLength:[data length]];
[appDel.inputStream <CALL_YOUR_METHOD>];
于 2013-06-19T16:23:00.903 回答
1

我将创建一个实用程序/管理器类来处理与服务器的通信。这样,您可以轻松地从代码的其他部分访问它。也很容易确保它是线程安全的。请注意,您应该考虑不在主线程上执行这些操作。

但是,如果您确实想访问 AppDelegate 中定义的变量,下面是代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.outputStream <method>];
于 2013-06-19T16:22:56.700 回答