AsyncSockets - ReadToData - 无法按预期工作

发布于 2025-01-01 17:55:24 字数 2081 浏览 1 评论 0原文

这是我在 stackoverflow 上提出的第一个具体问题,因为我还没有找到任何有用的解决方案来解决我的问题。 我需要在 iPhone 和 OSX 工作站(作为 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>

是的...现在我的最后一个问题:我做错了什么!? 为什么它对我不起作用:)?

问候和谢谢! 狙击手x

It's my first specific question here on stackoverflow, cause I couldn't found any helpful solutions for my problem yet.
I need a low level socket connection between my iPhone and OSX Workstation (as TCP Server), to interchange some media data like pictures or audio files. So I think AsyncSockets is a good choise to get this to work. I've often used it for some tiny byte communication.

My Problem is, that I want to use a kind of a header/protocol to tell the server how much data bytes are still in pipe.
A simple communication like "hello world" is working fine, so there are no connection problems.

The mobile device (that wants to send a picture) does the following.

[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];

The server is listening that way:

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];
}

Now: If I use readData:withTimeout:tag it all works like a charm. But once I change the code to readDataToData:withTimeout:tag, to split the header from the other content, the onSocket:didConnectToHost:port: method is never called. Here are some pretty function logs (I placed them in every delegate method)

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:]

So, next idea... just compare the sending and receiving bytes, so:

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

Yeah... now my final question: What am I doing wrong!?
Why isn't it working out for me :)?

Greetings & thanks!
sniperosx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梓梦 2025-01-08 17:55:24

找到了解决方案:

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

干杯
狙击手

[已关闭]

Found a solution:

Just don't use -1 as timeout.
With -1 timeout the AsyncSocket is reading data until the other side is closing the connection, so in this range no delegate method is called.

Cheerz
sniperosx

[Closed]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文