2015-03-30 41 views
0

我被困在這裏的一個非常基本的概念。我一直在爲我的項目使用GCDAsyncsocket。它是客戶端的請求響應類型,其中我從服務器(基於Java)通過套接字獲取xml文件,我讀取此文件,將其保存在App的文檔目錄中,解析發送給其他人的請求標記,獲取相應請求的響應以及將其寫入一個xml文件,在每個請求後添加響應並將其發送回服務器。在iOS中通過GCDAsyncsocket讀取一個xml文件

我試着讀取文件,但我得到的字節數據我想,我無法解碼該數據到適當的格式有人可以幫助我如何通過套接字讀取一個XML文件(GCDAsyncsocket)並保存它我的應用程序的文件目錄

這是基本的代碼,我一直在使用: - - (IBAction爲)連接:(ID)發送{

NSString *hostAddress = self.serverTextfield.text; 
uint16_t port = PORT; 

_delegateQueue = dispatch_queue_create("com.a.cs.delegateQueue", NULL); 
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:_delegateQueue]; 

DDLogInfo(@"Connecting to %@ on port %hu...", hostAddress, port); 

NSError *error = nil; 
if (![asyncSocket connectToHost:hostAddress onPort:port error:&error]) 
{ 
    DDLogError(@"Oops Error Connecting.. %@",error); 
    self.notificationTextView.text = @"Oops Error Connecting"; 
} else { 
    DDLogVerbose(@"Connected"); 
    self.notificationTextView.text = @"Connected"; 
} 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *uniqueID = [defaults objectForKey:@"UUID"]; 

NSLog(@"%@",uniqueID); 

NSUInteger len = [uniqueID lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 
Byte buffer[2]; 
buffer[0] = (0xff & (len >>8)); 
buffer[1] = (0xff & (len)); 

NSMutableData *outData = [NSMutableData dataWithCapacity:2]; 
[outData appendBytes:buffer length:2]; 
[outData appendData:[uniqueID dataUsingEncoding:NSUTF8StringEncoding]]; 

NSLog(@"%@",outData); 
[asyncSocket writeData:outData withTimeout:-1 tag:0]; 
[asyncSocket readDataWithTimeout:-1 tag:0]; 

}

這是我的操作方法通過點擊按鈕調用它醫學「連接」。我寫出一些數據發送到服務器,並開始讀取數據,並在委託didReadData我操縱我從服務器收到的數據,並再次調用
[襪子readDataWithTimeout:-1標籤:0];以便它不斷監聽讀取數據...

現在,而不是我從服務器獲取的字符串數據,我期待一個XML文件,我的服務器將發送給我..如何讀取此文件並操縱它?另外我怎樣才能發送一個文件到我保存在我的應用程序的文檔目錄中的服務器..任何幫助將不勝感激..

+0

你給了我們一點點繼續。通過說你「試着閱讀文件」我擔心你沒有閱讀過GCDAsyncSocket文檔,「入門」和「常見陷阱」,而是希望GCDAsyncSocket有一個你錯過的神奇的「readXMLstream」方法。由於它沒有,讀取文件的概念不適用於與庫進行交互的級別。你正在使用哪種-readData ...方法?你對這些數據做了什麼?是的,GCDAsyncSocket只能看到數據,而不能理解更高層次的數據。 – tobinjim 2015-03-31 15:04:10

+0

@tobinijm - 我已經更新了我的帖子上面...對不起,延遲! – user2606782 2015-04-07 08:14:26

+0

感謝您提供更多信息。一般來說,stackoverflow在這裏回答更具體的問題「爲什麼這個代碼出錯?」或「爲什麼我的觀點總是黑色,即使我......」多種問題,而不是關於方法或代碼審查的問題。我認爲您需要幫助處理髮送給您的XML數據,但您尚未提供該代碼。說這對你並不是很有幫助,所以我會發佈一個「答案」,可以在評論之外繼續對話。 – tobinjim 2015-04-07 12:39:29

回答

0

我會看的第一件事,如果你還沒有,是SimpleHTTPClient項目,GCDAsyncSocket包含在下載中。 XML doctype是HTTP數據包內的有效載荷,所以這是一個適合您的模型。

這就是說,你確定你的代碼發送到你的服務器什麼服務器預計?它只不過是一個UTF8字符串UUID而已?它不希望UUID被包裝在XML中?服務器是否會以某種方式記錄傳入的連接請求,您可以看到它獲得了期望的結果並實際返回給您XML?

+0

@ tobinjim-我已經看到了......但這不是我需要的......我只需要一種方法,通過它我可以使用GCDAsyncSocket將文件從客戶端(iOS)發送到服務器(Java),反之亦然。我的最終目標是比較XML的服務器和我在操作後發送的內容。所以你可以更具體一些,實際上讓我知道我能做到這一點..我真的被困在這裏。 – user2606782 2015-04-14 04:49:33

+0

那麼,你確定a)Java服務器理解你的請求,b)發回你期望的內容,以及c)GCDAsyncSocket已經將它放到你期望的數據緩衝區中了?如果你知道所有這些都是真實的,我想你需要NSXMLParser類,以-initWithData:調用在NSData中傳遞,GCDAsyncSocket爲你填充。 – tobinjim 2015-04-14 07:15:16