全局套接字启动 (AsyncSocket)

Posted

技术标签:

【中文标题】全局套接字启动 (AsyncSocket)【英文标题】:Global Socket Starts (AsyncSocket) 【发布时间】:2012-05-20 20:06:13 【问题描述】:

我正在尝试从另一个类(不在“applicationDidFinishLaunching”中)启动一个套接字,因此,在 AppDelegate.m 我正在调用类 netClass:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    netClass *network = [[netClass alloc] init];
    [network startNet];

而在netClass中,startNet方法正常启动socket:

- (void)startNet 

    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    ...
    [netService publish];

但是netClass中的asyncSocket方法,如“didAcceptNewSocket”、“socketDidDisconnect”、“netServiceDidPublish”,没有被调用。

知道怎么称呼它吗?

任何帮助将不胜感激:-)

【问题讨论】:

什么是netClass?您可能没有设置委托。 netClass 是我创建的另一个类,用于启动连接并处理委托方法。在 .h 文件中,我设置了委托,例如 NSObject <NSApplicationDelegate, NSNetServiceDelegate, GCDAsyncSocketDelegate>,但它不起作用。任何想法,斯蒂芬? @Alberto:这不是设置委托;那就是声明该类的实例可以是那些类型的委托。声明任何实例都可以是某些类型对象的委托,并不会使特定实例实际上成为特定其他对象的委托。 @PeterHosey,对不起,实际上,我还添加了[netService setDelegate:self];,但它不起作用!太奇怪了! 【参考方案1】:

您需要通过向您的任何 NSNetService 对象发送 setDelegate: 消息来设置委托 - 从您发布的代码中看起来,它是“netService”([netService setDelegate:self];)。

将“NSApplicationDelegate, NSNetServiceDelegate, GCDAsyncSocketDelegate”放在您的 .h 文件中不会设置委托,它基本上只是让编译器知道您打算实现这些协议的方法。另外,你不应该在那里有NSApplicationDelegate,因为你已经有一个应用程序委托。

【讨论】:

这就是为什么它很有趣:在 AppDelegate 中我不需要设置它([netService setDelegate:self];,它可以正常工作,调用委托方法,在我的类(netClass)中,甚至把setDelegate 不起作用!PS:NSApplicationDelegate 已删除。:-) @Alberto:NSNetService 不能“调用委托方法”来处理不是它的委托的东西。如果您指的是 NSApplicationDelegate 方法,那么这些方法是不相关的: NSApplication 将 NSApplicationDelegate 协议中列出的消息发送给它的委托,而 NSNetService 将 NSNetServiceDelegate 协议中列出的消息发送给它的委托。确保您的“netClass”(确实需要一个更好的名称)实例实际上已经创建了 NSNetService。 其实叫JSNetwork,netClass只是为了方便。 :-D。我错了:在 AppDelegate applicationDidFini[...] 我调用 [netService setDelegate:self];,但从“netClass”调用它不起作用。这真的很奇怪:相同的代码、相同的委托、相同的方法、不同的操作。我会在互联网上更好地查看。如果我发现任何真正相关的东西,我会在这里发布。谢谢,@PeterHosey。 @Alberto:您将 NSNetServiceDelegate 方法放在哪个类中? 如果没有在 JSNetwork 类中看到更多代码,很难说现在该做什么。您是否将 [netService setDelegate:self] 从应用程序委托中取出?你不能让 2 个对象成为某事的代表,它应该只在 JSNetwork 类中。我不确定是否应该将 setDelegate 消息发送到 netService,因为您没有显示该类的代码。

以上是关于全局套接字启动 (AsyncSocket)的主要内容,如果未能解决你的问题,请参考以下文章

asyncsocket "connectToHost" 总是成功并且从不返回失败

AsyncSocket TLS HOWTO

AsyncSocket 不调用委托

AsyncSocket 和 AsyncUdpSocket 的区别

NSTimer 不适用于 AsyncSocket 库

AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?