0

iPhone 上的目标 C:我试图在类级别声明以下对象,这样我就不必在每次写东西时都重新连接这个套接字。(每秒写多次)每当我写一个稳定的实时数据流时,它大约每 2 秒冻结一次。我不知道为什么,但确实如此。

代码:

Socket *socket = [Socket socket];
[socket connectToHostName:@"10.0.2.3" port:1220];

我尝试在实例数据中声明变量,然后在 +initialize 和 viewdidload 中对其进行初始化,但没有成功或出现错误。我已经搜索了几个小时试图找到一种方法来解决这个问题,在大约 20 种不同的解决方案之后,我发现没有一个可行。顺便说一下,socket 是来自于objective-c 的smallsockets 包中的一个对象。

小套接字:http ://smallsockets.sourceforge.net/

它工作得很好,除了每隔几秒钟冻结一次实时数据。我已将部分代码缩小到这两行。我知道创建然后连接套接字是导致延迟的原因。

任何帮助都非常感谢。

谢谢!!

[编辑]

这是我尝试的一些示例代码:实例声明:

Socket *socket; 

viewDidLoad:

socket = [Socket socket]; //Throws error on compile 

备用视图didload:

Socket *tempSocket = [Socket socket];
socket = tempSocket;
//This compiles fine, however it doesn't work when trying to use it
4

5 回答 5

2

不要在 +inittailize 中创建套接字,这还为时过早。

在 viewDidLoad 中的代码中添加一些调试日志记录 (NSLog()),并记录套接字以查看它是否已创建。然后在gdb里面打断点,看看是否有效。

-W

于 2009-10-26T08:41:00.043 回答
1

的代码+socket会很有趣。我的猜测是这是一种方便的方法,即这个套接字的结果是自动释放的。现在我不知道你是否在你的套接字属性中保留这个,但你应该,否则在运行循环完成后,套接字被释放。即你需要一个

@property (retain) Socket *socket; 

在你的接口文件中。

于 2009-10-26T09:20:48.297 回答
0

您可能想要使用AsyncSocket,它提供了带有套接字的异步操作(在 CFSocket 和 CFStream 之上)。

我在这个StackOverflow 答案中找到了它。

于 2009-10-26T08:47:40.243 回答
0

试图在类级别声明?

您的意思是,您希望“socket”成为您为整个类初始化的类范围全局变量,而不是实例?如果是这样,您不能将套接字声明为实例变量。实例变量只存在于实例(即分配的对象)中。相反,您必须在类之外声明它。全局变量通常在 .m 文件的 #import 行下声明。

然后你可以在任何你想要的地方初始化它。我推荐您从 applicationDidFinishLaunching 调用的类方法:

#import "Socket.h"

Socket *globalSocket = nil;

@implementation Socket

+ (void)connectGlobalSocket
{
    if (!globalSocket)
    {
        globalSocket = [[Socket socket] retain];
        [globalSocket connectToHostName:@"10.0.2.3" port:1220];
    }
}

....
于 2009-10-26T11:54:24.643 回答
0

那么,如果您的目的地无法到达或其他一些网络问题导致延迟,会发生什么?如果您的远程套接字正在等待某种确认,但您的 iPhone 在它应该发送 ACK 的时间被购买,那该怎么办?如果你没有使用一些类似 select() 的机制,你至少应该在另一个线程中完成所有同步网络的工作。NSThread 值得一看。

于 2009-10-26T09:35:56.773 回答