나는이 문제에 며칠 동안 고생하고 있으며 (위대한 사용자 @ SO의 도움으로) 해결책에 가까워지고있는 것처럼 보입니다. CocoaAsyncSocket 라이브러리를 사용하여 Windows 서버에 대한 TCP 소켓 연결을 만듭니다.라이브러리 (대리자) 메서드가 호출되지 않는 이유는 무엇입니까?
연결이 내 AppDelegate에에서 이루어지고: (AsyncSocket *) 양말 didConnectToHost :
- (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 커넥트 방법을 (있는 NSString *) 호스트 포트 :(UINT16) 포트 : 나는 NSLOG의 출력을 볼 수
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"connected :D");
}
이 방법 은를 호출되고 난이 성공적으로 연결하고있다. 로그 파일을 사용하여 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 태그 :)가 호출되지 않습니다. 불행히도이 문제는 제 1 단계에 불과하지만 다른 문제가 발생하기 전에이 문제를 해결해야합니다.
도움을 주시면 감사하겠습니다. 감사합니다 : D를 AsyncSocket.h 파일에서
Windows 서버는 어떻게 구현됩니까? 일부 '서버'는 버퍼가 가득 찰 때까지 또는 CR & LF 또는 CR 문자를받을 때까지 데이터를 보내지 않기 때문에 묻습니다. 그래서 : 당신의 서버가 데이터를 보내고 있다는 것을 확신합니까? 언제든지 telneting으로 확인할 수 있습니다. –
덧붙여서 위임 메서드가 어떻게 호출되는지 알고 싶으면 AsyncSocket.m의 소스 코드를 살펴보십시오. 3782 번에서 3785 행까지는 onSocket : didReadData : withTag :가 호출 된 방식을 정확하게 보여줍니다. – glorifiedHacker
또 다른 옵션은 데이터가 UTF8 문자열이 아니라는 것입니다. 'NSLog ("수신 길이 : % d", [데이터 길이]);'if (msg)'앞에 추가하십시오. 어떤 결과가 있습니까? 물론 이것이 호출 될 때만 이해할 수 있습니다. –