2011-03-19 33 views
1

我想使用下面的代碼來捕獲.NET服務器的響應。Asyncsocket iPhone讀取數據

做一個telnet測試工作(我得到的迴應);但是,使用此代碼,我沒有得到迴應。

-(IBAction)connectClicked:(id)sender { 
    if (![socket connectToHost:@"192.168.100.192" onPort:1337 error:nil]) { 
     NSLog(@"connection failed"); 
    }  
} 

-(IBAction)fireClicked:(id)sender { 
    NSString *welcomeMsg = @"GetId"; 
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding]; 
    [socket writeData:welcomeData withTimeout:-1 tag:0]; 
    NSLog(@"message sent!"); 
} 

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString*)host port:(UInt16)port { 
    NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu", sock, host, port); 
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 
} 

-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag { 
    NSLog(@"onSocket:%p didReadData:%i", tag);  
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 
} 

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag { 
    NSLog(@"onSocket:didWriteDataWithTag:%i", tag);  
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 
} 

我得到與服務器的連接,我可以將信息發送到服務器,但我沒有得到答覆。

這就是我在日誌中得到的;

2011-03-21 10:00:32.424 CtC[33521:207] onSocket:0x4c3ebc0 didConnectToHost:192.168.100.192 port:1337 
2011-03-21 10:00:35.846 CtC[33521:207] message sent! 

爲什麼我沒有收到回覆?

回答

1

我不清楚什麼可能會出錯,因爲代碼片段不夠。但是,這是我會怎麼去:

  1. 檢查,當你連接到主機,它不會引發錯誤
  2. 在你fireClicked方法確保插座正確的初始化
  3. 也許覆蓋didConnectToHost那方法和添加的NSLog語句,看看您是否連接
  4. 使用給定的套接字「襪子」裏面didReadData和didWriteDataWithTag代替變量「插座」
  5. 告訴我們你得到了什麼記錄語句
  6. 告訴我們您是如何創建套接字以及如何連接到主機的。

希望幫助安迪 -

+0

嗨安迪!謝謝你的支持! - 我更新了我的問題......但它仍然不起作用......你可以看看嗎?謝謝! – Derk 2011-03-21 08:59:12

+0

正如Suprie所提到的,您必須確保服務器端知道您的來電結束時間(Enter,CTRL-D等)。否則,.Net服務器可能只是坐在那裏等待進一步的輸入。 – 2011-03-21 15:14:51

+0

嗨安迪! .net服務器會發送命令回iphone應用程序.... – Derk 2011-03-22 13:23:15

2

我也有同樣的問題。由於服務器不知道命令何時結束,因此在寫入數據時我模擬了「輸入」按鈕。

所以這條線

NSString *welcomeMsg = @"GetId"; 

應該成爲

NSString *welcomeMsg = @"GetId\r\n"; 

現在的工作。

+0

對我來說,它仍然沒有工作......?! – Derk 2011-03-22 13:22:13

+0

@derk嘗試實現' - (void)onSocket:(AsyncSocket *)sender willDisconnectWithError:(NSError *)error' – Suprie 2011-03-22 17:34:27

+0

我剛剛閱讀了你對ANDY的評論..嘗試改變這個'[sock readDataToData:[AsyncSocket CRLFData] withTimeout: -1 tag:0];'to'[sock readDataWithTimeout:-1 tag:0];' – Suprie 2011-03-22 17:40:32

0

WireShark在這些情況下總是很有用。 telnet和你的應用程序之間的快速比較可能表明有所不同。

嘗試刪除didConnectToHost中的'readDataWithTimeout',因爲無論如何你都會調用它。
我想知道你是否得到了一個斷開導致讀取超時,即你的有線協議是錯誤的。 WireShark應該可以幫到那裏。