Я застрял в этой проблеме уже несколько дней и, кажется, приближаюсь к решению (с помощью замечательных пользователей @ SO). Я использую библиотеку CocoaAsyncSocket для создания подключения через сокет TCP к серверу Windows.
Соединение выполняется в моем appDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
socket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error])
{
NSLog(@"Error connecting: %@", error);
}
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
У меня есть метод подключения (часть библиотеки), называемый onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port:
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"connected :D");
}
Этот метод вызывается, так как я вижу вывод из NSLOG и успешно подключаюсь. Я также вижу успешное подключение с компьютера с Windows (используя файлы журнала).
Я также проверил, что вызывается другой метод делегата :
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
NSLog(@"error - disconnecting");
// start reconnecting procedure here...
}
Я проверил, что метод willDisconnectWithError работает, запустив мое приложение в симуляторе, а затем отключив сетевой шнур от ноутбука. Как только я это сделал, я увидел в своем выводе строку «ошибка - отключение».
Однако большая проблема заключается в том, что мой метод делегата (опять же, из библиотеки) не вызывается.
Метод делегата не вызывается:
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
if(msg)
{
NSLog(@"RX:%@",msg);
}
else
{
NSLog(@"Fail");
}
}
Я уверен в своих знаниях и понимании того, как работают методы делегирования, но я все еще не совсем понимаю, КАК они ВЫЗЫВАЮТСЯ. Чтобы еще больше усложнить и вызвать путаницу, один метод делегата (onSocket: порт didConnectToHost:) вызывается, а другой (onSocket: тег didReadData:) не вызывается. К сожалению, это только первый шаг моей проблемы, но мне нужно исправить эту проблему, прежде чем я перейду к другой проблеме.
Любая помощь будет принята с благодарностью. Спасибо
NSLog ("RX length: %d", [data length]);
передif(msg)
. Какие результаты вы получаете? Конечно, это будет иметь смысл только тогда, когда вам удастся вызвать его. - person Rok Jarc   schedule 08.06.2012msg
будет что-то или ноль. Я говорю оdata
.msg
может быть нулевым, еслиdata
не закодирован в UTF8 - это не означает, что соединение не работает. - person Rok Jarc   schedule 08.06.2012