Это мой первый конкретный вопрос здесь о 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: для отделения заголовка от другого содержимого, метод 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>
Да ... теперь мой последний вопрос: что я делаю не так !?Почему у меня не получается :)?
Привет и спасибо!sniperosx