AsyncSockets - ReadToData - 不能像预期的那样工作

时间:2012-01-31 13:00:32

标签: iphone cocoa sockets tcp

这是我在stackoverflow上的第一个具体问题,因为我找不到任何有用的解决方案来解决我的问题。 我需要在我的iPhone和OSX Workstation(作为TCP服务器)之间建立低级套接字连接,以交换一些媒体数据,如图片或音频文件。所以我认为AsyncSockets是一个很好的选择,让它工作。我经常用它进行一些小字节通信。

我的问题是,我想使用一种头/协议来告诉服务器管道中还有多少数据字节。 像“hello world”这样的简单通信工作正常,因此没有连接问题。

移动设备(想要发送图片)执行以下操作。

[self setHost:@"172.22.42.207"];
self.socket = [[[AsyncSocket alloc] initWithDelegate:self] autorelease];

NSError *err = nil;
[[self socket] connectToHost:self.host onPort:5009 error:&err];

...

NSData *t = UIImagePNGRepresentation(test);

NSString *header = [NSString stringWithFormat:@"%i", t.length];
NSMutableData *headerData = [[header dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];
[headerData appendBytes:[AsyncSocket CRLFData] length:[[AsyncSocket CRLFData] length]];

[[self socket] writeData:headerData withTimeout:-1 tag:0];

服务器正在监听:

AsyncSocket *s = [[AsyncSocket alloc] initWithDelegate:self];
NSError *err = nil;
[s acceptOnPort:5009 error:&err];

if(err)
    NSLog(@"EPIC FAIL...\n%@", err);

...

- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket
{
   NSLog(@"%s", __PRETTY_FUNCTION__);    
   [newSocket readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
}

现在:如果我使用readData:withTimeout:tag它就像魅力一样。但是,一旦我将代码更改为readDataToData:withTimeout:tag,要将头与其他内容分开,就永远不会调用onSocket:didConnectToHost:port:方法。这里有一些漂亮的函数日志(我将它们放在每个委托方法中)

Client side:
2012-01-31 13:40:32.962 AVMobile[20643:10703] -[SLViewController onSocket:didConnectToHost:port:]
2012-01-31 13:40:32.964 AVMobile[20643:10703] -[SLViewController onSocket:didWriteDataWithTag:]

Server side: 
2012-01-31 13:40:32.961 AVServer[20618:707] -[SLAppDelegate onSocket:didAcceptNewSocket:]

所以,下一个想法......只是比较发送和接收字节,所以:

Sending:    <33333736 35365cba>
Receiving:  <33333736 35365cba>

是的......现在我的最后一个问题:我做错了什么!? 为什么不适合我:)?

问候&amp;谢谢! sniperosx

1 个答案:

答案 0 :(得分:0)

找到解决方案:

不要使用-1作为超时。 在-1超时时,AsyncSocket正在读取数据,直到另一端关闭连接,因此在此范围内不会调用委托方法。

Cheerz sniperosx

[已结束]